全局输入参数和 SQL 执行出现问题
在使用 T-SQL 编译 SQL 查询并使用 EXEC 执行它的存储过程中(@sqlstatement),您可能会遇到错误,指出“必须声明标量变量“@RowFrom”。”当尝试在@sqlstatement变量中使用全局输入参数@RowFrom和@RowTo时。
理解问题
发生错误是因为参数@RowFrom和@RowTo在 @sqlstatement 字符串中无法识别。这是因为 SQL 字符串在没有显式声明的情况下无法直接访问全局变量。
解决方案:将 Int 转换为 String 或使用适当的参数化
有两种方法可以解决此问题:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;'; EXEC sys.sp_executesql @sql, N'@RowFrom int, @RowTo int', @RowFrom, @RowTo;
现代版本的考虑
在现代版本的 SQL 中,您可以使用 CONCAT 函数进行字符串连接:
SET @sql = CONCAT(N'SELECT ', @RowTo, ' * 5');
但是,建议使用适当的参数化来防止 SQL 注入漏洞。
以上是执行动态SQL时如何处理T-SQL存储过程中的全局输入参数?的详细内容。更多信息请关注PHP中文网其他相关文章!