如何仅在列存在时使用SQL列名?

如何仅在列存在时使用SQL列名?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我一直在尝试从select中的CASE(def.OPTION\u CATEGORY\u ID)中获取文本结果,但我很难实现这些术语 我要做的是检查sys.columns中是否存在OPTION\u CATEGORY\u ID。如果是,那么我尝试使用底部的When-then将int转换为文本,但是SQL不知道列名,因此CASE(def.OPTION\u CATEGORY\u ID)失败,因为列名无效 是否有任何方法可以使用别名调用def.OPTION\u CATEGORY\u ID,这样SQL就不会

我一直在尝试从select中的
CASE(def.OPTION\u CATEGORY\u ID)
中获取文本结果,但我很难实现这些术语

我要做的是检查sys.columns中是否存在
OPTION\u CATEGORY\u ID
。如果是,那么我尝试使用底部的
When-then
将int转换为文本,但是SQL不知道列名,因此
CASE(def.OPTION\u CATEGORY\u ID)
失败,因为列名无效

是否有任何方法可以使用别名调用
def.OPTION\u CATEGORY\u ID
,这样SQL就不会失败? 谢谢


如果要选择一个列,但不确定它是否存在,则不能在代码中显式地编写它,并期望它能够编译

应根据列存在与否的运行时信息动态生成语句:

DECLARE @statement VARCHAR(MAX)

IF((SELECT COUNT(*)
              FROM   sys.columns 
              WHERE  Name  = 'OPTION_CATEGORY_ID'
                     AND Object_ID = Object_ID(N'TFC_OPTION_DEFINITION')) > 0)
BEGIN
 SET @statement = --assign a query which uses OPTION_CATEGORY_ID
END
ELSE
BEGIN
 SET @statement = --assign a query which does not use OPTION_CATEGORY_ID
END

EXEC sp_executesql @statement

你想一下子做的太多了。这种“SQL中的SQL”不起作用。您需要做的是查询模式并生成一个字符串变量来保存新的SQL语句(编写SQL的SQL)。然后,作为一个单独的步骤,您可以使用
EXEC sp_executesql
将该字符串作为SQL语句运行,该语句还支持参数化查询。谷歌
动态SQL和SQL Server
了解更多详细信息。此要求背后的目标是什么?也许有一种更简单的方法可以到达那里……我的DB可能在def中有“OPTION\u CATEGORY\u ID”列,也可能没有。我希望在这两种情况下使用相同的查询,但当它存在时,我希望底部的情况为int-ID生成正确的文本翻译。
DECLARE @statement VARCHAR(MAX)

IF((SELECT COUNT(*)
              FROM   sys.columns 
              WHERE  Name  = 'OPTION_CATEGORY_ID'
                     AND Object_ID = Object_ID(N'TFC_OPTION_DEFINITION')) > 0)
BEGIN
 SET @statement = --assign a query which uses OPTION_CATEGORY_ID
END
ELSE
BEGIN
 SET @statement = --assign a query which does not use OPTION_CATEGORY_ID
END

EXEC sp_executesql @statement