使用CASE的查询中的对象名称无效

时间:2011-01-17 11:57:10

标签: sql sql-server tsql

我有以下问题:

我有3张桌子: alt text
如果要创建文档,有两个选项:

  1. 您可以从头开始创建文档。
    • 程序将使用默认配置在Config表中创建记录。
    • 在这种情况下,1个配置记录恰好属于1个文档记录
  2. 您可以从DocumentTemplate创建文档
    • DocumentTemplate允许您预先定义可以基于文档的文档配置。
    • 程序会将Document表中的新记录链接到与DocumentTemplate配置记录相同的配置记录。
    • 1配置记录恰好属于1个DocumentTemplate记录,属于0 .. *文档记录
  3. 如果您从未创建模板,则数据库中将不存在“DocumentTemplate”表。

    现在我想选择以下列:

    1. Config.config_data
    2. Document.document_name OR DocumentTemplate.template_name
      • 如果配置是由模板创建的,我想要DocumentTemplate.template_name
      • 其他我想要Document.document_name
    3. 我写了以下查询:

      SELECT 
      -- //Name must be name of Document or name of DocumentTemplate 
      CASE 
          WHEN [c].[config_from_template] = 0 
          THEN -- //Get Document name
              (SELECT [d].[document_name]
              FROM [Document] [d]
              WHERE [d].[document_config_id] = [c].[config_id])
          WHEN [c].[config_from_template] = 1 
          AND OBJECT_ID ('[DocumentTemplate]','U') IS NOT NULL
          THEN -- //Get template name
              (SELECT [t].[template_name]
              FROM [DocumentTemplate] [t]
              WHERE [t].[template_config_id] = [c].[config_id])
      END as 'Name',
      configNode.value('@Key', 'nvarchar(128)') as 'ConfigKey', -- //Key from xml @Key    
      configNode.value('@Value', 'nvarchar(128)') as 'ConfigValue' -- //Value from xml @Value 
      FROM [Config] [c]
      -- //Create one record for each config option
      CROSS APPLY [Config].[config_data].nodes('//ConfigOptions') as ConfigNodes(configNode) 
      

      如果DocumentTemplate不存在,此查询将引发语法错误。

        

      Msg 208,Level 16,State 1,Line 1
        无效的对象名称'DocumentTemplate'。

      如何重写此查询以满足我的要求?

      提前致谢

1 个答案:

答案 0 :(得分:1)

我想这是因为引擎始终会检查代码的有效性,无论代码是否会被执行。

也许你可以解决这个问题,执行这样的子查询:

EXEC ('SELECT [t].[template_name]
   FROM [DocumentTemplate] [t]
   WHERE [t].[template_config_id] = ' + CAST([c].[config_id] AS VARCHAR(10)')

我没有检查这是否有效,甚至可能有拼写错误。但它应该从......开始......