Sql-Server

動態 SQL 查詢 - 如何將 int 添加到程式碼中?

  • June 29, 2019

考慮:

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相當於 an NVARCHAR 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 的詛咒和祝福

引用自:https://dba.stackexchange.com/questions/241607