SQLServer数据库存储过程中拼接字符串注意的问题 在SQL Server数据库中书写复杂的存储过程时,⼀般的做法是拼接字符串,最后使⽤EXEC sp_executesql '拼接的字符串' 查询出结果。
先看⼀段代码:
1-- =============================================
2-- Author: XXX
3-- Create date: 2014-09-19
4-- Description: 获取学⽣列表信息
5-- =============================================
6ALTER PROCEDURE[dbo].[Sp_GetStudentList]
7@StudentId INT--主键id
8AS
9BEGIN
sql server拼接字符串函数
10
11SET NOCOUNT ON;
12
13DECLARE@SqlSelectResult NVARCHAR(MAX) ='';
14SET@SqlSelectResult='SELECT * FROM Student AS s ';
15
16IF (ISNULL(@StudentId, 0) >0)
17BEGIN
18SET@SqlSelectResult=@SqlSelectResult+' WHERE s.ClassId > '+@StudentId;
19END
20
21PRINT (@SqlSelectResult);
22
23EXEC sp_executesql @SqlSelectResult;
24
25SET NOCOUNT OFF;
26END
然后调⽤该存储过程: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
……
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论