首页 > 代码库 > SQL Server数据库存储过程中拼接字符串注意的问题
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 BEGIN10 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 BEGIN18 SET @SqlSelectResult = @SqlSelectResult + ‘ WHERE s.ClassId > ‘ + @StudentId;19 END20 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 INT --主键id AS
……
SQL Server数据库存储过程中拼接字符串注意的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。