SQL Server数据库存储过程中拼接字符串注意的问题

  • 2019 年 10 月 4 日
  • 筆記

  在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                 ……