带有“FOR XML AUTO”的无效列

时间:2013-05-30 13:45:25

标签: sql sql-server-2008

我的一个存储过程中有一个典型的“无效列名”,但我很难理解任何流行的解决方法如何解决我的问题:(

我的存储过程执行如下操作:

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”部分之后,想想可能是问题,但我得到相同的错误。

要回答我确信有些人会问的问题,查询:

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

没有结果,正如您在Column_A不在Table_A中时所期望的那样。

AND ...不,我不能改变数据库结构,它必须是这种解决方法,因为表可能包含也可能不包含此列,具体取决于数据库实例,我需要一个“全包” “......

有什么好主意吗?

1 个答案:

答案 0 :(得分: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条件置于其上方并根据实际查询进行修改。