2016-12-20 32 views
0

我們必須使用在那裏我們的應用程序通過一些列的名稱動態SQL內置存儲過程。偶爾空白值或空值傳遞給列名稱。在這些情況下,sp需要爲該列返回空值。我試着處理這一點,但無論我做什麼我各種方法似乎得到以下錯誤:處理空白列在動態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. 

下面是一個例子查詢,試圖在@ col2的參數去處理空列名時情況:

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

什麼版本的sql server? –

+1

更換'EXECUTE sp_executesql的@ sqlCommand'用'打印@ sqlCommand',查看您正在生成的SQL,你可能會發現這一問題很快... – JohnLBevan

+0

SQL SERVER 2014年,感謝您的幫助 – Andrew

回答

0

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 

,當你用動態SQL的問題,請嘗試使用Print語句來輸出生成的命令SSMS(或者,如果你不使用SSMS,找到一些其他的方式來拉回生成的SQL,所以你可以看到這是怎麼回事上。

與你原來的代碼這樣做表明語句生成是:

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

...你很可能會看到這個問題有。

的問題是,你糊塗了,你用生成動態SQL的SQL之間,並恢復是動態SQL語句的一部分所需的SQL。

+1

我也想改變CASE語句的COALESCE和NULLIF清潔OP碼了一點:'COALESCE(NULLIF(QUOTENAME(@ col2的),「 '),NULL)Col2' –

+1

謝謝約翰,這是完美的排序。我之前並沒有遇到過使用動態sql引用聲明的一部分,所以這對於學習 – Andrew

+0

無需擔心。 PS。我同意@約翰約瑟夫的建議改進;更乾淨。小錯字:NULL應該在引號中以確保它在添加到動態SQL之前被視爲字符串;即'COALESCE(NULLIF(QUOTENAME(@ col2的), ''), 'NULL')+ 'Col2'' – JohnLBevan