全域輸入參數與 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);傳遞整數值@RowTo 作為字串,使用CONVERT函數:
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;'; EXEC sys.sp_executesql @sql, N'@RowFrom int, @RowTo int', @RowFrom, @RowTo;不要將值連接到SQL 字串中,而是使用參數化查詢來安全地傳遞輸入參數。例如:
現代版本的考量
SET @sql = CONCAT(N'SELECT ', @RowTo, ' * 5');
在現代版本的SQL 中,您可以使用CONCAT 函數進行字串連接:
但是,建議使用適當的參數化來防止SQL 注入漏洞。以上是執行動態SQL時如何處理T-SQL預存程序中的全域輸入參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!