我正在研究BPM并提取了一个大的xml文件,我现在想用SQL过滤。我想过滤它,以便我只提取具有101的“角色类型”的contractrole子对象。我的xml是这样的形式:
<contract>
<ContractRole>
<ContractId>xxxgg</ContractId>
<RoleType>104</RoleType>
<LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
</ContractRole>
<ContractRole>
<ContractId>xxxaa</ContractId>
<RoleType>100</RoleType>
<LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
</ContractRole>
<ContractRole>
<ContractId>xxxdd</ContractId>
<RoleType>101</RoleType>
<LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
</ContractRole>
<contract>
如何过滤掉101以外的其他角色类型的条目?我几乎没有使用SQL的经验,但我希望使用SELECT语句WHERE roletype是101.我可以在直接调用数据库时轻松完成此操作,但在这里我需要从XML中提取相同的信息。
在线随机示例提出了类似的建议:
SELECT child.value('(LastUpdate/text())[1]', 'TIMESTAMP') AS [LastUpdateDate]
, child.value('(ContractId/text())[1]', 'BIGINT') AS [Id]
FROM [Contract] AS T
CROSS APPLY [ImportData].nodes('/Contract/ContractRole[RoleType/text() == "101"]') AS ImportData(child)
有人可以澄清我如何进行此过滤器。在选择任何内容之前,我是否需要声明我的xml名称?或者它是如何工作的?
答案 0 :(得分:0)
假设这是SqlServer
,并且你在松散变量中有Xml
(否则你需要CROSS APPLY到表,但表格是相同的(有{{3}用于直接从磁盘处理Xml列或Xml文件。一些注意事项:
contract
和Contract
不一样=
进行相等BIGINT
其中一个日期类型(如DATETIME
)似乎更适合xml的类型映射。 contract
关闭标记拼写错误。
SELECT node.value('(LastUpdateDate/text())[1]', 'DATETIME') AS [LastUpdateDate]
, node.value('(ContractId/text())[1]', 'VARCHAR(20)') AS [Id]
FROM @x.nodes('/contract/ContractRole[RoleType/text() = "101"]') AS nodes(node);
我假设了以下内容:
DECLARE @x XML =
'<contract>
<ContractRole>
<ContractId>xxxgg</ContractId>
<RoleType>104</RoleType>
<LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
</ContractRole>
<ContractRole>
<ContractId>xxxaa</ContractId>
<RoleType>100</RoleType>
<LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
</ContractRole>
<ContractRole>
<ContractId>xxxdd</ContractId>
<RoleType>101</RoleType>
<LastUpdateDate>2014-04-01 12:34:12.84</LastUpdateDate>
</ContractRole>
</contract>';
返回
LastUpdateDate Id
----------------------- --------------------
2014-04-01 12:34:12.840 xxxdd