2011-01-17 3 views
0

Я следующую задачу:Неверное имя объекта в запросе с ДЕЛУ

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

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

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

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

  1. Config.config_data
  2. Document.document_name ИЛИ DocumentTemplate.template_name
    • Если конфигурации создается шаблон, я хочу DocumentTemplate.template_name
    • Else Я хочу 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 не существует.

Msg 208, Level 16, State 1, Line 1
Неверное имя объекта 'DocumentTemplate'.

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

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

+2

«Если вы никогда не создавали шаблон, таблица« DocumentTable »не будет существовать в базе данных». - это ВЫСОКО необычный дизайн. База данных приложения без данных определенного типа должна иметь * пустую * таблицу, а не * таблицу без изменений *! – AakashM

+0

(+1 @Aakashm) Извините, я имею в виду 'DocumentTemplate' вместо' DocumentTable'. Но я согласен. Я использую структуру, поэтому я должен принять этот дизайн. – hwcverwe

ответ

1

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

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

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

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