我的一个存储过程中有一个典型的“无效列名”,但我很难理解任何流行的解决方法如何解决我的问题:(
我的存储过程执行如下操作:
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 ...不,我不能改变数据库结构,它必须是这种解决方法,因为表可能包含也可能不包含此列,具体取决于数据库实例,我需要一个“全包” “......
有什么好主意吗?
答案 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
条件置于其上方并根据实际查询进行修改。