2016-12-20 5 views
0

Wir haben eine gespeicherte Prozedur dynamische SQL gebaut mit denen unsere Anwendung in einigen Spaltennamen übergeben. Gelegentlich werden Leer- oder Nullwerte für den Spaltennamen übergeben. In diesen Fällen muss der SP einen Nullwert für die Spalte zurückgeben. Ich habe verschiedene Wege versucht, dies zu handhaben, aber alles, was ich tun, ich zu sein scheinen, den Fehler zu erhalten unter:Umgang mit leeren Spalten in dynamischen SQL-

An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Change the alias to a valid name. 

Hier ist ein Beispiel Abfrage mit Fall bei dem Versuch, in der @ Col2 param null Spaltennamen zu handhaben:

DECLARE 
@Col1 varchar(32) = 'name', 
@Col2 varchar(32) = '', 
@sqlCommand nvarchar(MAX) = '' 


SET @sqlCommand = @sqlCommand + N' 
     SELECT ' + quotename(@Col1) + ' AS ' + quotename(@Col1) + ', 
      CASE WHEN ' + quotename(@Col2) + ' IS NULL OR ' + quotename(@Col2) + ' = '''' 
       THEN NULL 
       ELSE ' + quotename(@Col2) + ' 
      END AS Col2 

     FROM sys.columns c ' 

EXECUTE sp_executesql @sqlCommand 
+0

welche Version von SQL Server? –

+1

Ersetzen 'EXECUTE Sp_executesql @ sqlCommand' mit' print @ sqlCommand' die SQL Sie erzeugen, zu sehen und Sie werden wahrscheinlich das Problem ziemlich schnell ... – JohnLBevan

+0

SQLServer 2014, vielen Dank für Ihre Hilfe – Andrew

Antwort

0

Lösung

DECLARE 
@Col1 varchar(32) = 'name', 
@Col2 varchar(32) = '', 
@sqlCommand nvarchar(MAX) = '' 


SET @sqlCommand = @sqlCommand + N' 
     SELECT ' + quotename(@Col1) + ' AS ' + quotename(@Col1) + ',' + 
      CASE WHEN @Col2 IS NULL OR @Col2 = '' 
       THEN 'NULL ' 
       ELSE quotename(@Col2) 
      END + ' AS Col2 
     FROM sys.columns c ' 

--print @sqlCommand 

EXECUTE sp_executesql @sqlCommand 

Hinweise

Wenn Sie ein Problem mit Dynamic SQL haben, versuchen Sie die Print Anweisung für die Ausgabe zu SSMS den erzeugten Befehl (oder, wenn Sie nicht SSMS verwenden, finden eine andere Art und Weise die erzeugte SQL zurück zu ziehen, damit Sie sehen, was los ist auf.

tun dies mit Ihrem ursprünglichen Code zeigt, dass die Anweisung generiert wurde:

SELECT [name] AS [name], 
    CASE WHEN [] IS NULL OR [] = '' 
     THEN NULL 
     ELSE [] 
    END AS Col2 
    FROM sys.columns c 

..., die Sie wahrscheinlich das Problem mit sehen.

Das Problem war, dass man zwischen dem SQL wurden mit Ihnen die dynamischen SQL zu generieren, und die SQL erforderlich sein, einen Teil der dynamischen SQL-Anweisung zurückgegeben verwechselt wurde.

+1

Ich würde auch die CASE-Anweisung für eine COALESCE und NULLIF ändern Sie den OP-Code nach oben ein wenig zu reinigen: 'COALESCE (NULLIF (QUOTENAME (@ Col2), ' '), NULL) Col2' –

+1

Danke John, das ist perfekt sortiert. Ich war tatsächlich nicht dazu gekommen, einen Teil der Aussage aus den Anführungszeichen mit dynamischem sql herauszunehmen, also ist das eine hilfreiche Sache, um zu lernen – Andrew

+0

Keine Sorge. ps. Ich stimme der vorgeschlagenen Verbesserung von @ JohnJoseph zu; viel sauberer. Kleinere Tippfehler: Der NULL sollte in Anführungszeichen gesetzt werden, um sicherzustellen, dass er als String behandelt wird, bevor er zum dynamischen SQL hinzugefügt wird. dh 'COALESCE (NULLIF (QUOTENAME (@ Col2), ''), 'NULL') + 'Col2'' – JohnLBevan

Verwandte Themen