我有一个庞大的存储过程,我正在构建一个sql语句。最后,我创建了一个像这样的参数列表:
请求@paramList需要和N在它前面吗?
SELECT @paramList = '@param1 nvarchar(300),
@param2 nvarchar(10),
@param3 nvarchar(10),
@param4 nvarchar(100),
@param5 nvarchar(1000),
@param6 nvarchar(1000),
@param7 nvarchar(200),
@param8 nvarchar(2000)’
然后我这样调用sp_executesql:
EXEC sp_executesql @sql, @paramList,
@param1,@param2,@param3,@param4,
@param5,@param6,@param7,@param8
其中@sql是语句,paramList是我的参数列表,所有其他变量是我在存储过程顶部声明的参数。这是正确的方法吗?
答案 0 :(得分:1)
是的,这是正确的方法。您可以将'@param1 nvarchar(300), ..., @param8 nvarchar(2000)'
直接传递给sp_executesql
,无需通过@paramList传递它。此外,sp_executesql
的第二个参数是unicode类型,因此您可能会执行一些额外的ascii到unicode对话。你可以直接做:
EXEC sp_executesql @sql,
N'@param1 nvarchar(300),...,@param8 nvarchar(2000)',
@param1,...,@param8;
将参数列表声明保留在调用本身中是否更好,因为它与传递的实际参数紧密耦合。
答案 1 :(得分:1)
如果字符串不使用数据库排序规则以外的字符,则不需要N''表示法。
您没有声明@paramList的声明。 N''只有在声明为NVARCHAR时才有用。
SQL Server自动处理VARCHAR和NVARCHAR值之间的转换(同样关于db排序规则)。
因此,在您的情况下,解决方案有效。 “正确”的方式是使用NVARCHAR和N'',但在这种情况下不是必需的。