2015-09-04 99 views
1

我一直试图从CASE(def.OPTION_CATEGORY_ID)中选择一个文本结果,但我很难实施条款。如何仅在列存在时使用SQL列名称?

我想要做的是检查是否OPTION_CATEGORY_ID是sys.columns中的现有列。如果是,那么我试图通过在底部使用When - Then来进行文本翻译,但SQL不知道列名,所以CASE(def.OPTION_CATEGORY_ID)由于列名无效而失败。

有什么办法可以使用别名调用def.OPTION_CATEGORY_ID,这样SQL就不会让它事先失效吗? 感谢

SELECT DISTINCT * 
    FROM 
     (SELECT def.OPTION_DEF_ID AS 'Def ID', 
       ass.ASSET_NAME AS 'Asset Name', 
       CASE(def.OPTION_TYPE_ID) 
        WHEN 1 THEN 'A' 
        WHEN 2 THEN 'B' 

       END AS 'Option Type', 
       case when exists (SELECT name 
       FROM sys.columns 
       WHERE Name = 'OPTION_CATEGORY_ID' 
        AND Object_ID = Object_ID(N'TFC_OPTION_DEFINITION')) 

    then 
     -- Column Exists 
     CASE(def.OPTION_CATEGORY_ID) 
        WHEN 1 THEN 'C' 
        WHEN 2 THEN 'D' 
        WHEN 3 THEN 'E' 
        WHEN 4 THEN 'F' 


       end 
       End AS 'test' , 

     -- the rest of the select 
+2

你试图做太多一次。这种“SQL-SQL”不起作用。你需要做的是查询模式,并生成一个单一的字符串变量,它包含一个新的SQL语句*(写SQL的SQL)*。然后,作为一个单独的步骤,您可以使用'EXEC sp_executesql'作为SQL语句运行该字符串,该EXEC sp_executesql还支持参数化查询。 Google'Dynamic-SQL和SQL-Server'获取更多细节。 – MatBailie

+0

这个要求背后的目标是什么?也许有一个更简单的方法去那里... – Paolo

+0

我的数据库可能并且可能没有在def中的列“OPTION_CATEGORY_ID”。 我想在这两种情况下使用相同的查询,但是当它存在时,我希望底部情况为int ID生成正确的文本转换。 –

回答

2

如果你想选择一列,你不知道,如果它存在,你不能把它写在明确你的代码,并期望它来编译。

你应该建立动态的基于该列的存在与否的运行时间信息的声明:

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 
+0

感谢您的帮助 –

相关问题