您的位置:首页 > 数据库

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

2014-09-19 17:55 323 查看
  在SQLServer数据库中书写复杂的存储过程时,一般的做法是拼接字符串,最后使用EXECsp_executesql'拼接的字符串'查询出结果。

先看一段代码:

--=============================================
--Author:XXX
--Createdate:2014-09-19
--Description:获取学生列表信息
--=============================================
ALTERPROCEDURE[dbo].[Sp_GetStudentList]
@StudentIdINT--主键id
AS
BEGIN

SETNOCOUNTON;

DECLARE@SqlSelectResultNVARCHAR(MAX)='';
SET@SqlSelectResult='SELECT*FROMStudentASs';

IF(ISNULL(@StudentId,0)>0)
BEGIN
SET@SqlSelectResult=@SqlSelectResult+'WHEREs.ClassId>'+@StudentId;
END

PRINT(@SqlSelectResult);

EXECsp_executesql@SqlSelectResult;

SETNOCOUNTOFF;
END


然后调用该存储过程:EXECSp_GetStudentList1。结果如下:



运行失败。

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

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

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

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

[b]将18行代码修改为:[/b]

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

解决方法2:在存储过程开始定义的时候,将参数定义为字符串类型

ALTERPROCEDURE[dbo].[Sp_GetStudentList]
@StudentIdINT--主键id
AS
……


本篇完。

技术研究方向:专注于Web(Mvc)开发框架、WinForm开发框架、项目(代码)自动化生成器、ORM等技术研究与开发应用

企业级项目经验:编务管理系统、印前管理系统、印务管理系统、图书销售管理系统、图书发行管理系统、图书馆管理系统、

数据交换平台、ERP综合管理平台

欢迎转载,请注明文章出处与链接信息。如果文章对您有帮助,请帮忙推荐,谢谢!

撰写人:张传宁http://www.cnblogs.com/SavionZhang



……


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: