zoukankan      html  css  js  c++  java
  • SQL Server数据库存储过程中拼接字符串注意的问题

      在SQL Server数据库中书写复杂的存储过程时,一般的做法是拼接字符串,最后使用EXEC sp_executesql '拼接的字符串' 查询出结果。

    先看一段代码:

     1 -- =============================================
     2 -- Author:        XXX
     3 -- Create date:   2014-09-19
     4 -- Description:   获取学生列表信息
     5 -- =============================================
     6 ALTER PROCEDURE [dbo].[Sp_GetStudentList]
     7     @StudentId INT   --主键id
     8 AS
     9 BEGIN
    10     
    11     SET NOCOUNT ON;
    12     
    13     DECLARE @SqlSelectResult NVARCHAR(MAX) = '';    
    14     SET @SqlSelectResult = 'SELECT * FROM Student AS s ';
    15     
    16     IF (ISNULL(@StudentId, 0) > 0)
    17     BEGIN
    18         SET @SqlSelectResult = @SqlSelectResult + ' WHERE s.ClassId > ' + @StudentId;
    19     END
    20     
    21     PRINT (@SqlSelectResult);
    22     
    23     EXEC sp_executesql @SqlSelectResult;
    24     
    25     SET NOCOUNT OFF;
    26 END

    然后调用该存储过程:EXEC Sp_GetStudentList 1。结果如下:

    运行失败。

    仔细分析原因发现:存储过程参数@StudentId 类型为INT(整形)型;而自定义变量@SqlSelectResult是NVARCHAR(MAX)字符串类型。

    在23行,EXEC sp_executesql @SqlSelectResult;执行拼接字符串时,报错,编译器尝试将字符串类型转换成int类型失败。

    意思是:SQL Server中在拼接字符串时,所有的变量必须全部是字符串类型,才能正确拼接,否则报错。

    解决方法1:将非字符串类型的变量转换为字符串类型,

                       将18行代码修改为:

            SET @SqlSelectResult = @SqlSelectResult + ' WHERE s.ClassId > ' + convert(nvarchar(10),@StudentId);

    解决方法2:在存储过程开始定义的时候,将参数定义为字符串类型
                   ALTER PROCEDURE [dbo].[Sp_GetStudentList]
                   @StudentId NVARCHAR(10)    --主键id
                   AS
    ……
  • 相关阅读:
    第二阶段冲刺第七天,6月6日。
    第二阶段冲刺第六天,6月5日。
    第二阶段冲刺第五天,6月4日。
    第二阶段冲刺第四天,6月3日。
    第二阶段冲刺第三天,6月2日。
    第二阶段冲刺第二天,6月1日。
    垃圾收集器与内存分配策略(1)
    OutOfMemoryError异常
    对象访问
    java内存区域与内存溢出异常(2)
  • 原文地址:https://www.cnblogs.com/SavionZhang/p/3981976.html
Copyright © 2011-2022 走看看