2017-03-29 13 views
1

私が実行するストアドプロシージャの一環として、いくつかの動的SQLを持っている:動的SQLでCOALESCEとNULL削除

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;' 

これは細かい動作しますが、私は広告aにしたいので、ITEM_NAMEはNULLにすることはできません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 '='. 

私はどここの表示されていない ')' I s。私は間違って何をしていますか?

編集:ここ幹部は

ある
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

あなたが挿入される値の周りにそれを使用し、あなたのinsertの列名の先まわりcoalesce()を置くことはできません。

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は、2つの異なる列に挿入されます。それが意図的なのかどうかは分かりませんが、私はそれを指摘すると思っています。

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で

関連する問題