最近开发写存储过程的时候碰到一个问题。应用场景为:后台展示数据列表,进行查询的时候,执行存储过程报错:必须声明标量变量“@xxxx”

由于上家公司都是用的orm框架,很少写原生的sql,所以把它记下来,慢慢积累经验。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

1-数据库表设计如下

表名:UserInfo(ID, UserName,  UserDept)。

Server 执行存储过程 必须声明标量变量

2-存储过程为将列表进行分页展示,但是由于自己没有看懂那个分页的存储过程(不想误导别人),就把他简化了一下,看懂了再整理一篇博客出来。

简化成了展示所有的用户,可以根据UserName查询

ALTER PROCEDURE [dbo].[p_userinfo_list]
@username nvarchar(50) = ''
as
set nocount on
set transaction isolation level read uncommitted
set xact_abort on

DECLARE @sql nvarchar(1024)
if @username != ''
    set @sql = 'select * from t_userinfo where username=@username' --错误写法
    --set @sql = 'select * from t_userinfo  where username = '''+ convert(varchar, @username)+ '''' 正确写法
else 
    set @sql = 'select * from t_userinfo'
exec sp_executesql @sql

执行存储过程:

exec p_userinfo_list '用户1',报错:

Server 执行存储过程 必须声明标量变量

 查了资料把where条件改进了一下:set @sql = 'select * from t_userinfo where username = '''+ convert(varchar, @username)+ ''''

再执行存储过程,可以显示成功。

Server 执行存储过程 必须声明标量变量

 

but: 那些分号看了半天没看懂,就请教了同事,理解如下:

看最开头'select XXXX'

然后再看中间的 xxx username=''' 三个',  前面两个代表转义再接一个'单引号代表真正的 ' 单引号,后面的三个'''也是如此,这样就代表 ''中间的是一个变量。

还有一种报错情况就是: 不存在列xxx(或者是说列名无效),就是sql会把你传入的参数,看成一个列名,这时候可能也需要通过''进行转义,大概就是这样。

ps:google好像有时候图片打不开,火狐,360可以打开,其他的没试过。

 以上文章如有错误,误导了您,请及时指出,欢迎批评。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄