在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中文網其他相關文章!