我有以下问题:
我有3张桌子:
如果要创建文档,有两个选项:
如果您从未创建模板,则数据库中将不存在“DocumentTemplate”表。
现在我想选择以下列:
我写了以下查询:
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'。
如何重写此查询以满足我的要求?
提前致谢
答案 0 :(得分:1)
我想这是因为引擎始终会检查代码的有效性,无论代码是否会被执行。
也许你可以解决这个问题,执行这样的子查询:
EXEC ('SELECT [t].[template_name]
FROM [DocumentTemplate] [t]
WHERE [t].[template_config_id] = ' + CAST([c].[config_id] AS VARCHAR(10)')
我没有检查这是否有效,甚至可能有拼写错误。但它应该从......开始......