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,这样就导致一些难以察觉的问题。