关于sp_executesql

SQL 的参数顺序,和存储过程定义时的参数顺序一致,否则会导致参数赋值混乱
如下:
exec sp_executesql
-- SQL
N'EXEC AISDB.dbo.USP_GetMessgeInfo
@Order_Type,
@Module_Name,
@Receiver_Name,
@Handled,
@Summary_Iden,
@Op_Name,
@Caller'
-- DECLARE
,N'@Order_Type varchar(50),@Module_Name varchar(100),@Receiver_Name varchar(50),@Handled bit,@Summary_Iden int,@Op_Name varchar(50),@Caller varchar(50)'
-- VALUES
,@Order_Type='',@Module_Name='',@Receiver_Name='sysadmin',@Handled=0,@Summary_Iden=NULL,@Op_Name=NULL,@Caller='client'
上面的语句会翻译成下面这个语句在服务器上执行:
DECLARE @Order_Type varchar(50),@Module_Name varchar(100),@Receiver_Name varchar(50),@Handled bit,@Summary_Iden int,@Op_Name varchar(50),@Caller varchar(50)
SELECT @Order_Type='',@Module_Name='',@Receiver_Name='sysadmin',@Handled=0,@Summary_Iden=NULL,@Op_Name=NULL,@Caller='client'
EXEC AISDB.dbo.USP_GetMessgeInfo
@Order_Type,
@Module_Name,
@Receiver_Name,
@Handled,
@Summary_Iden,
@Op_Name,
@Caller

注意:上面的 SQL部分在最终被翻译执行时,是依据这里的定义进行的,并且这里调用存储过程是,并没有使用参数,而是直接使用参数值调用 这就要求 SQL 的参数顺序,和存储过程定义时的参数顺序一致,否则会导致参数赋值混乱。
比如上面这个调用,最终翻译成存储过程调用如下:
EXEC AISDB.dbo.USP_GetMessgeInfo
@Order_Type,
@Module_Name,
@Receiver_Name,
@Handled ,
@Summary_Iden,
@Op_Name,
@Caller
请注意这里是参数值调用,没有指定存储过程参数名,尽管各个变量的名字和存储过程的参数名字相同,但是他实际是按照对应位置给存储过程参数赋值,进行调用的。
所以它和下面这个写法是不同的:
EXEC AISDB.dbo.USP_GetMessgeInfo
@Order_Type = '',
@Module_Name = '',
@Receiver_Name = 'sysadmin',
@Handled = 0,
@Summary_Iden = null,
@Op_Name = null,
@Caller = null
请注意这里使用了存储过程参数名字,所以这里是不管参数顺序的,是按照参数名字赋值的。
而上面这个存储过程在数据库中的默认参数顺序如下:
EXEC AISDB.dbo.USP_GetMessgeInfo
@Order_Type = null,
@Module_Name = null,
@Receiver_Name = null,
@Summary_Iden = null,
@Op_Name = null,
@Handled = null,
@Caller = NULL
那么,在不使用参数名字进行调用时,即:按照sp_executesql 的 SQL部分进行调用,请注意黄色底色部分参数对应关系,@Handled的值会赋值给@Summary_Iden,这样就导致一些难以察觉的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值