【发布时间】:2014-09-12 07:26:33
【问题描述】:
这与这个问题有关: Import 'xml' into Sql Server
您将如何处理可选的 XML 节点,假设“IsFixed”是一个可选节点,它存在于一个文件中而在另一个文件中不存在,如何在代码中放入条件以不执行“ Events.value" 并避免出现 Null 列?
DECLARE @XML XML = '
<EventSchedule>
<Event Uid="2" Type="Main Event">
<EventKind>MainEvent</EventKind>
<Fields>
<Parameter Name="Type" Value="TV_Show"/>
<Parameter Name="Name" Value="The Muppets"/>
<Parameter Name="Duration" Value="00:30:00"/>
</Fields>
</Event>
<Event Uid="3" Type="Secondary Event">
<EventKind>SecondaryEvent</EventKind>
<Fields>
<Parameter Name="Type" Value="TV_Show"/>
<Parameter Name="Name" Value="The Muppets II"/>
<Parameter Name="Duration" Value="00:30:00"/>
</Fields>
</Event>
</EventSchedule>'
如果 IsFixed 节点不存在,则不要执行粗线:
SELECT
EventUID = Events.value('@Uid', 'int'),
EventType = Events.value('@Type', 'varchar(20)'),
***EventIsFixed = Events.value('(IsFixed)[1]', 'varchar(20)'),***
EventKind = Events.value('(EventKind)[1]', 'varchar(20)'),
ParameterType = Events.value('(Fields/Parameter[@Name="Type"]/@Value)[1]', 'varchar(20)'),
ParameterName = Events.value('(Fields/Parameter[@Name="Name"]/@Value)[1]', 'varchar(20)'),
ParameterDuration = Events.value('(Fields/Parameter[@Name="Duration"]/@Value)[1]', 'varchar(20)')
FROM
@XML.nodes('/EventSchedule/Event') AS XTbl(Events)
我尝试在 SELECT 语句中使用 CASE WHEN 但没有成功:
SELECT
EventUID = Events.value('@Uid', 'int'),
EventType = Events.value('@Type', 'varchar(20)'),
CASE
WHEN Events.value('(IsFixed)[1]', 'varchar(20)') IS NOT NULL
THEN ''
END AS EventIsFixed,
EventKind = Events.value('(EventKind)[1]', 'varchar(20)'),
ParameterType = Events.value('(Fields/Parameter[@Name="Type"]/@Value)[1]', 'varchar(20)'),
ParameterName = Events.value('(Fields/Parameter[@Name="Name"]/@Value)[1]', 'varchar(20)'),
ParameterDuration = Events.value('(Fields/Parameter[@Name="Duration"]/@Value)[1]', 'varchar(20)')
FROM
@XML.nodes('/EventSchedule/Event') AS XTbl(Events)
上面的代码仍然创建了一个作为 EventIsFixed 的空值列(输出表)。
EventUID EventType EventIsFixed EventKind ParameterType ParameterName ParameterDuration
2 Main Event MainEvent TV_Show The Muppets 00:30:00
3 Secondary Event SecondaryEvent TV_Show The Muppets II 00:30:00
我想要做的是当 XML 节点存在时在表中有列,而当 XML 节点不存在时(动态地)根本没有列,如何?
【问题讨论】: