2017-03-01 118 views
2

我有以下SQL Server上查詢,一些值存儲在前面計算的變量:如何逃生動態SQL單引號

SET @Command = N'INSERT INTO Products (Id 
           ,Region 
           ,Name 
           ,Category 
           ,CreatedBy 
           ,CreatedOn 
           ,) SELECT ' + @Id + ', 
              Region, 
              ''' + @ProductName + ''', 
              Category, 
              CreatedBy, 
              CreatedOn FROM ' + @ProductTable + ' 
               WITH (NOLOCK) WHERE Id IS NOT NULL'; 

    EXEC(@Command) 

它運行良好,除非@ProductName的價值包含引號(如:吉姆的產品),在這種情況下,我得到以下錯誤:字符串後閉合的引號

有沒有辦法來處理變量單引號在這樣的動態查詢,其中插入一個選定的值(@Pr在這種情況下的oductName)是直接插入的值,而不是源表上的實際列名,該表的值需要被檢索以進行插入?

+0

是絕對必要在這裏做動態SQL? – Augwa

+0

您正在使用哪個數據庫? – Utsav

+0

@Utsav:SQL Server。也更新了主帖。 – Cranialsurge

回答

3

最好的方法是使用sp_executesql而不是EXEC並使用適當的參數爲@ProductName值。

無法參數化的查詢的其餘部分(表名稱@ProductTable)將保持動態字符串連接。

在這種情況下,您不需要轉義任何內容,並且可以防止SQL注入。

事情是這樣的:

SET @Command = 
    N'INSERT INTO Products 
     (Id 
     ,Region 
     ,Name 
     ,Category 
     ,CreatedBy 
     ,CreatedOn) 
    SELECT 
     @ParamId 
     ,Region 
     ,@ParamProductName 
     ,Category 
     ,CreatedBy 
     ,CreatedOn 
    FROM ' + @ProductTable + N' WITH (NOLOCK) 
    WHERE ID IS NOT NULL' 
    ; 

EXEC sp_executesql 
    @Command 
    ,N'@ParamId int, @ParamProductName nvarchar(255)' 
    ,@ParamId = @Id 
    ,@ParamProductName = @ProductName 
; 
+0

完美,正是我需要的!謝謝@Vladimir。 – Cranialsurge