这是在存储过程中使用sp_executesql的正确方法吗?

时间:2009-09-15 20:28:24

标签: sql-server sql-server-2005 tsql

我有一个庞大的存储过程,我正在构建一个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是我的参数列表,所有其他变量是我在存储过程顶部声明的参数。这是正确的方法吗?

2 个答案:

答案 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'',但在这种情况下不是必需的。