2016-08-21 48 views
1

任何人都可以幫助解決這種情況嗎?如何使用動態查詢插入表中?使用SQL Server中的sp_executesql更新表格

DECLARE 
    @TypeCode varchar(25), 
    @BomDateB varchar(25), 
    @BomDateA varchar(25), 
    @TbName varchar(25), 
    @SQL varchar(max) 

SET @TypeCode = 'PS-BPRG15AGW' 
SET @TbName = 'z'[email protected] 
SET @BomDateB = '8/19/2016' 
SET @BomDateA = '8/20/2016' 

SET @SQL = 'UPDATE [PMLite].[dbo].['[email protected]+'] 
      SET [BOM Date] = '[email protected]+' 
      WHERE [BOM Date] = '[email protected]+'' 

EXEC sp_executesql @SQL 
+0

究竟是什麼問題?你正在插入還是更新?您提供的查詢會產生一些錯誤? – Whencesoever

+0

有這樣的錯誤。 「消息214,級別16,狀態2,過程sp_executesql,行1 過程期望類型爲'ntext/nchar/nvarchar'的參數'@statement'」。 – Bagong

+0

我想更新動態表名稱n參數 – Bagong

回答

1

這將是正確的方法做你的更新:

DECLARE @TypeCode VARCHAR(25) 
    , @BomDateB VARCHAR(25) 
    , @BomDateA VARCHAR(25) 
    , @TbName NVARCHAR(25) 
    , @SQL NVARCHAR(MAX); 

SET @TypeCode = N'PS-BPRG15AGW'; 
SET @TbName = N'z' + @TypeCode; 
SET @BomDateB = '8/19/2016'; 
SET @BomDateA = '8/20/2016'; 

SET @SQL = N' 
    UPDATE [PMLite].[dbo].' + QUOTENAME(@TbName) + ' 
    SET [BOM Date] = CONVERT(NVARCHAR(24), @BomDateA, 121) 
    WHERE [BOM Date] = CONVERT(NVARCHAR(24), @BomDateB, 121);'; 

EXEC sp_executesql @SQL 
    , N'@BomDateB VARCHAR(25), @BomDateA VARCHAR(25)' 
    , @BomDateB 
    , @BomDateA; 

就像我在評論中已經說過了,不要Concat的動態SQL時,它不是絕對需要(見@BomDateA@BomDateB參數)。

而不是用括號包裝您的文本,使用QUOTENAME()。該內置函數用於將對象名稱包裝在括號中,並從SQL Injection保護您的代碼。

從文檔接過:

QUOTENAME(的Transact-SQL)

返回一個Unicode字符串添加了使輸入 串一個有效的SQL Server分隔標識符的分隔符。

+0

謝謝先生Evaldas – Bagong

+1

讚美QuoteName –

0

你@SQL應該NVARCHAR ..

因此改變像下面

Declare @Sql NVARCHAR(4000) 

最終會有在你的代碼的一些錯誤,to avoid conversion issues ..所以

更改日期像

SET [BOM Date] = '[email protected]+' 

SET [BOM Date] = '+''''+CONVERT(nvarchar(24), @BomDateA, 121)+''''+' 
+0

感謝它的工作 – Bagong

+0

這是不正確的...你應該使用適當的參數,而不是字符串連接。 –