Sql-Server
動態 SQL 查詢 - 如何將 int 添加到程式碼中?
考慮:
Declare @stringsvar varchar(1000) Declare @Emp_id int DECLARE @strvar SYSNAME = 'Employee_test' SET @stringsvar = ('select * from' + ' ' + @strvar + ' where emp_id' + ' =' + @Emp_id) Print @stringsvar
上面的查詢給出瞭如下所述的錯誤:
消息 245,級別 16,狀態 1,第 17 行將 nvarchar 值“select * from Employee_test where emp_id =”轉換為數據類型 int 時轉換失敗。
在這種情況下需要做什麼?
George 的回答確實解決了您的問題,但它讓您很容易受到SQL 注入攻擊。
雖然將 an 轉換
INT
為 aVARCHAR 11
可能不會導致任何問題,但sysname相當於 anNVARCHAR 128
,您可以在其中塞入大量額外程式碼。為了使您的程式碼完全安全,您需要這樣做:
DECLARE @stringsvar NVARCHAR(1000) = ''; DECLARE @Emp_id INT = 1; DECLARE @strvar sysname = N'Employee_test'; SET @stringsvar = ( N'select * from ' + QUOTENAME(@strvar) + N' where emp_id' + N' = @iEmp_id' ); PRINT @stringsvar; EXEC sys.sp_executesql @stringsvar, N'@iEmp_id INT', @iEmp_id = @Emp_id;
使用sp_executesql發出參數化動態 SQL,並使用 quotename使表名成為不可執行的程式碼是一個更安全的選擇。
如需更多參考,我建議前往此處:動態 SQL 的詛咒和祝福