2013-05-30 93 views
0

我在其中一個存儲過程中有一個典型的「無效列名」,但我很努力瞭解任何常用的解決方法如何解決我的問題:(帶有「FOR XML AUTO」的無效列

我的存儲過程確實是這樣的:?

IF EXISTS (SELECT * FROM sysobjects o 
      JOIN syscolumns c 
      ON o.id = c.id 
      WHERE o.Name = 'Table_A' 
      AND c.Name = 'Column_A') 

    BEGIN 
     SELECT * FROM Table_B 
     JOIN Table_A 
     ON Table_B.Column_B = Table_A.Column_B 
     WHERE Table_A.Column_A = 1 
     FOR XML AUTO 
    END 

ELSE 
    --Do something completely different 

所以...我收到了錯誤Table_A.Column_A是無效的,但我怎麼回事可以參考它在我查詢我試着使用動態SQL創建字符串直到「FOR XML AUTO」部分,然後使用存儲過程在之後標記「FOR XML AUTO」部分,thinknig可能是問題所在,但我得到的錯誤是相同的要麼。

要回答的問題我敢肯定有人會問,查詢:

SELECT * FROM sysobjects o 
      JOIN syscolumns c 
      ON o.id = c.id 
      WHERE o.Name = 'Table_A' 
      AND c.Name = 'Column_A' 

息率沒有結果,因爲當Column_A不表-A你所期望的。

和......不,我不能更改數據庫結構,而不是,它必須是這種解決方法,因爲該表可能會或可能不包含此列,這取決於數據庫實例,我需要一個「catch-所有「...

任何好點子?

+0

你可以添加你的動態SQL版本嗎?我想不出沒有動態SQL的方法,獲得完全相同的錯誤聽起來很奇怪。 –

回答

1

問題是您的代碼不會解析,除非由於子查詢中的引用而使數據中出現列。 if在運行時進行評估。所有的查詢都必須在編譯時解析。

圍繞這個(我知道的)唯一的方法是動態SQL。

下面是代碼樣本,做工作:

declare @x xml; 
    declare @sql nvarchar(max) = ' 
    select @x = (SELECT * 
      FROM INFORMATION_SCHEMA.tables t JOIN 
        INFORMATION_SCHEMA.COLUMNS c 
        ON t.TABLE_NAME = c.TABLE_NAME 
      WHERE t.TABLE_SCHEMA = ''dbo'' 
      FOR XML AUTO 
      )'; 

    exec sp_executesql @sql, N'@x xml output', @x = @x output; 

    select @x; 

您可以然後將它上面的if條件並修改它爲您的實際查詢。

+0

最後很簡單......我不熟悉'sp_executesql',它有幫助。謝謝 :) – LeeCambl

相關問題