Неверное имя объекта в запросе с CASE - PullRequest
0 голосов
/ 17 января 2011

У меня следующая проблема:

У меня есть 3 таблицы: alt text
Если вы хотите создать документ, есть два варианта:

  1. Вы можете создать документ с нуля.
    • Программа создаст запись в таблице конфигурации с конфигурацией по умолчанию.
    • В этом случае 1 запись конфигурации принадлежит ровно 1 записи документа
  2. Вы можете создать документ из шаблона документа
    • DocumentTemplate позволяет вам заранее задавать конфигурации документов, на которых вы можете основывать документы.
    • Программа свяжет новую запись в таблице документов с той же записью конфигурации, что и запись конфигурации DocumentTemplate.
    • 1 Запись конфигурации принадлежит ровно 1 записи DocumentTemplate и принадлежит 0 .. * Записи документа

Если вы никогда не создавали шаблон, таблица 'DocumentTemplate' не будет существовать в базе данных.

Теперь я хочу выбрать следующие столбцы:

  1. Config.config_data
  2. Document.document_name ИЛИ DocumentTemplate.template_name
    • Если config создан с помощью шаблона, я хочу DocumentTemplate.template_name
    • Остальное Я хочу Document.document_name

Я написал следующий запрос:

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 не существует.

Сообщение 208, Уровень 16, Состояние 1, Строка 1
Неверное имя объекта DocumentTemplate.

Как мне переписать этот запрос для удовлетворения моих требований?

заранее спасибо

1 Ответ

1 голос
/ 17 января 2011

Полагаю, это потому, что движок всегда проверяет правильность вашего кода, независимо от того, будет ли он выполняться или нет.

Может быть, вы можете обойти эту проверку, выполнив подзапрос следующим образом:

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

Я не проверял, работает ли это и может даже иметь опечатку.Но это должно послужить отправной точкой для начала ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...