前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL Server数据库存储过程中拼接字符串注意的问题

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

作者头像
张传宁IT讲堂
发布2019-09-17 17:21:53
2.3K0
发布2019-09-17 17:21:53
举报

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

先看一段代码:

代码语言:javascript
复制
 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行代码修改为:

代码语言:javascript
复制
        SET @SqlSelectResult = @SqlSelectResult + ' WHERE s.ClassId > ' + convert(nvarchar(10),@StudentId);

解决方法2:在存储过程开始定义的时候,将参数定义为字符串类型
代码语言:javascript
复制
               ALTER PROCEDURE [dbo].[Sp_GetStudentList]
               @StudentId NVARCHAR(10)    --主键id
               AS
               ……
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-09-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档