在 T-SQL 中参数化动态 SQL 查询
在动态 SQL 查询中,参数对于防止 SQL 注入攻击和确保类型安全至关重要。在 T-SQL 动态 SQL 中使用参数时,将它们正确传递给 sp_executesql 存储过程非常重要。
问题:
考虑以下期望的动态查询WHERE 子句的 UNIQUEIDENTIFIER 参数:
CREATE PROCEDURE [dbo].[sp_Test1] /* 'b0da56dc-fc73-4c0e-85f7-541e3e8f249d' */ ( @p_CreatedBy UNIQUEIDENTIFIER ) AS DECLARE @sql NVARCHAR(4000) SET @sql =' DECLARE @p_CreatedBY UNIQUEIDENTIFIER SELECT DateTime, Subject, CreatedBy FROM ( SELECT DateTime, Subject, CreatedBy, ROW_NUMBER() OVER(ORDER BY DateTime ) AS Indexing FROM ComposeMail WHERE CreatedBy = @p_CreatedBy /* <--- the problem is in this condition */ ) AS NewDataTable ' EXEC sp_executesql @sql
当此查询时不传递参数执行,不返回结果。
解决方案:
要解决此问题,必须将参数传递给 sp_executesql。修改 WHERE 子句如下:
WHERE CreatedBy = @p
并使用 @p 参数名称传递参数:
EXECUTE sp_executesql @sql, N'@p UNIQUEIDENTIFIER', @p = @p_CreatedBY
这确保 WHERE 子句条件使用来自调用者的参数化值,防止SQL注入并确保类型安全。
以上是如何在 T-SQL 中安全地参数化动态 SQL 查询?的详细内容。更多信息请关注PHP中文网其他相关文章!