2017-03-29 4 views
1

ich einige dynamische SQL haben als Teil einer gespeicherten Prozedur, die ich ausführen möchten:mit COALESCE in dynamischen NULL Entfernen 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;' 

Das läuft gut, aber ITEM_NAME kann nicht NULL sein, damit ich zu ad a wollen koaleszieren():

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

Aber ich bin immer diese Fehlermeldung:

Incorrect syntax near the keyword 'COALESCE'. 

Unclosed quotation mark after the character string '); 

       SET @Id = SCOPE_IDENTITY(); 

       RETURN;'. 

Incorrect syntax near '='. 

Für das Leben von mir, ich sehe nicht, wo diese ')' i s. Was mache ich falsch?

Edit: hier ist die exec

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

in dynamischer sql, 2 Hochkommata = 1 Einzel Zitat. Nach der Konvertierung heißt das: (coalesce ([item_name], ') ..... versuche einen weiteren Satz von' ':' hinzuzufügen (koaleszieren ([item_name], '' '') – fleetmack

+0

@OK. Ich sehe und und das macht Sinn.Ich bekomme immer noch: Falsche Syntax in der Nähe des Schlüsselwortes "COALESCE". Falsche Syntax in der Nähe von "=". –

+0

Sorry, ich kenne SQL Server überhaupt nicht.Vielleicht brauchen Sie ein Leerzeichen vor dem Zusammenfügen? also vielleicht versuchen ' (koaleszieren [Elementname],' '' ') – fleetmack

Antwort

3

Sie nicht coalesce() um den Spaltennamen Ziel Ihrer insert setzen können, verwenden Sie es um den Wert eingefügt wird.

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


Anmerkung: @UPD_USR_DOM_NAME in zwei unterschiedliche Spalten eingefügt wird. Ich bin mir nicht sicher, ob das Absicht ist, ich dachte nur, ich würde darauf hinweisen.

Sie können auch den Rest Ihrer Werte für die Verwendung mit sp_executesql vollständig parametrisieren, anstatt sie so zu verketten. (Erraten zu den Datentypen Ihrer Parameter in diesem Beispiel)

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; 

dynamische SQL-Referenz: