2017-03-29 37 views
1

我有一些動態的SQL作爲存儲過程的一部分,我想執行:動態刪除空子與COALESCE SQL

SET @SQL_TXT = 'INSERT INTO ' [email protected]_TABLE_NAME+ 
       '([ITEM_NAME] 
       ,[ADD_DTT] 
       ,[ADD_USR] 
       ,[UPD_DTT] 
       ,[UPD_USR] 
       ,[ACTIVE_IND] 
       ,[ITEM_PK]) 
     VALUES 
       ('''[email protected]_VALUE+''' 
      , CURRENT_TIMESTAMP 
      , '''[email protected]_USR_DOM_NAME+''', CURRENT_TIMESTAMP,'''[email protected]_USR_DOM_NAME+''',''Y'','''[email protected]_PK+'''); 
      SET @Id = SCOPE_IDENTITY(); 
      RETURN;' 

這運行正常,但讓我想廣告ITEM_NAME不能爲空COALESE():

SET @SQL_TXT = 'INSERT INTO ' [email protected]_TABLE_NAME+ 
      '(COALESCE([ITEM_NAME], '') 
      ,[ADD_DTT] 
      ,[ADD_USR] 
      ,[UPD_DTT] 
      ,[UPD_USR] 
      ,[ACTIVE_IND] 
      ,[ITEM_PK]) 
    VALUES 
      ('''[email protected]_VALUE+''' 
     , CURRENT_TIMESTAMP 
     , '''[email protected]_USR_DOM_NAME+''', CURRENT_TIMESTAMP,'''[email protected]_USR_DOM_NAME+''',''Y'','''[email protected]_PK+'''); 
     SET @Id = SCOPE_IDENTITY(); 
     RETURN;' 

但我收到此錯誤:

Incorrect syntax near the keyword 'COALESCE'. 

Unclosed quotation mark after the character string '); 

       SET @Id = SCOPE_IDENTITY(); 

       RETURN;'. 

Incorrect syntax near '='. 

對我來說,我的生活中沒有看到這種 ')' 我秒。我究竟做錯了什麼?

編輯:這裏是EXEC

EXECUTE SP_executesql @SQL_TXT, N'@Id INTEGER OUTPUT', @Id OUTPUT 
+1

,2個單引號= 1單引用。所以在轉換後,它會顯示:(coalesce([item_name],').....嘗試添加另一組'':'(coalesce([item_name],'''') – fleetmack

+0

@OK,這是有道理的,我仍然得到:關鍵字'COALESCE'附近的語法錯誤'='附近的語法錯誤 –

+0

對不起,我根本不知道SQL Server,也許你需要一個空間才能合併? '(coalesce [item_name],'''') – fleetmack

回答

3

你不能把coalesce()圍繞你insert的列名的目標,你用它周圍插入值。

SET @SQL_TXT = 'INSERT INTO ' [email protected]_TABLE_NAME+ 
       '([ITEM_NAME] 
       ,[ADD_DTT] 
       ,[ADD_USR] 
       ,[UPD_DTT] 
       ,[UPD_USR] 
       ,[ACTIVE_IND] 
       ,[ITEM_PK]) 
     VALUES 
       ('''+coalesce(@UPD_VALUE,'')+''' 
      , CURRENT_TIMESTAMP 
      , '''[email protected]_USR_DOM_NAME+''', CURRENT_TIMESTAMP,'''[email protected]_USR_DOM_NAME+''',''Y'','''[email protected]_PK+'''); 
      SET @Id = SCOPE_IDENTITY(); 
      RETURN;' 


注: @UPD_USR_DOM_NAME插入到兩個不同的列。不知道這是否是有意的,只是想我會指出。

您還可以完全參數化其餘值,以便與sp_executesql一起使用,而不是像這樣連接它們。 (在該示例中,在數據類型的參數的猜測)

declare @sql nvarchar(max); 
declare @params nvarchar(max); 
declare @id int; 

set @sql = N'INSERT INTO ' [email protected]_TABLE_NAME+'([ITEM_NAME] ,[ADD_DTT] ,[ADD_USR] ,[UPD_DTT] ,[UPD_USR] ,[ACTIVE_IND] ,[ITEM_PK]) 
     VALUES (coalesce(@UPD_VALUE,''), CURRENT_TIMESTAMP, @UPD_USR_DOM_NAME, CURRENT_TIMESTAMP,@UPD_USR_DOM_NAME,''Y'',@ITEM_PK); 
     SET @Id = SCOPE_IDENTITY(); 
     RETURN;' 

set @params = N'@UPD_VALUE varchar(32),@UPD_USR_DOM_NAME varchar(32), @ITEM_PK varchar(32), @Id INTEGER OUTPUT'; 

EXECUTE SP_executesql @sql, @params, @UPD_Value, @UPD_USER_DOM_NAME, @ITEM_PK, @Id = @Id OUTPUT; 

動態SQL參考:

在動態sql