Sql server 如何在sql查询中解析多个名称空间xml
我有一个包含XML列的表,我正试图从XML数据中获取某些列。这些列位于hasSql server 如何在sql查询中解析多个名称空间xml,sql-server,tsql,xpath,xml-namespaces,xquery-sql,Sql Server,Tsql,Xpath,Xml Namespaces,Xquery Sql,我有一个包含XML列的表,我正试图从XML数据中获取某些列。这些列位于hasINSERT语句的PositionRoles标记下。不幸的是,我得到了NULL值 以下是我使用的XML示例: <request-broker-message version="1.0"> <request class="UPDATE_ORGANISATION_HIERARCHY" culture="tr-TR"> <parameter name="OrgHierarc
INSERT
语句的PositionRoles
标记下。不幸的是,我得到了NULL
值
以下是我使用的XML示例:
<request-broker-message version="1.0">
<request class="UPDATE_ORGANISATION_HIERARCHY" culture="tr-TR">
<parameter name="OrgHierarchyDatasets_schema">
(here is not important...)
</parameter>
<parameter name="OrgHierarchyDatasets_diffgram">
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet>
<PositionRoles diffgr:id="PositionRoles1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<POSTN_ID>0000-0000H1-POS</POSTN_ID>
<ROLE_ID>0000-00002B-ROL</ROLE_ID>
<STATUS>1</STATUS>
</PositionRoles>
</NewDataSet>
</diffgr:diffgram>
</parameter>
<parameter name="ExistNodeCheck" type="System.Boolean">True</parameter>
</request>
</request-broker-message>
不确定您想要的具体值是什么,但这应该足以让您达到目标。您需要将适当的名称空间放在带有
的中(该不以开头;
,语句以一结尾),然后用相关名称空间名称作为相关节点的前缀(例如diffgr:
用于diffgram
):
DECLARE@XML=
'
(这里不重要……)
0000-0000H1-POS
0000-00002B-ROL
1.
真的
';
使用XMLNAMESPACES('urn:schemas microsoft com:xml-diffgram-v1'作为diffgr,
“urn:schemas microsoft com:xml msdata”作为msdata)
选择dg.NDS.value('(PositionRoles/@diffgr:id)[1],'varchar(30')作为id,
dg.NDS.value('(PositionRoles/@msdata:rowOrder)[1],'int')作为rowOrder,
dg.NDS.value('(PositionRoles/POSTN_ID/text())[1],'varchar(30')作为POSTN_ID
FROM(VALUES(@XML))V(X)
交叉应用V.X.nodes('request-broker-message/request/parameter/diffgr:diffgram/NewDataSet')dg(NDS);
我还删除了NOLOCK
hit,因为我怀疑它被误用了:感谢大家的关注,我直接使用了诸如…PositionRoles[@diffgr:hasChanges=“inserted”]/STATUS/text()之类的查询。它迫切地解决了这个问题。不过,稍后我会尝试交叉应用方法。
;WITH XMLNAMESPACES('urn:schemas-microsoft-com:xml-diffgram-v1' AS diffgr,
'inserted' AS hasChanges)
INSERT INTO TMP_ORGANIZATION_HIERARCHY_LOGS_TABLE(POSITION_ID, OPERATION, ROLE_ID, PACKET_OWNER, RESPONSE_TIME)
SELECT
*
FROM TMP_PACKET_LOG_TABLE (NOLOCK)
WHERE
RESPONSE_PACKET.value('(/request-broker-message/request/parameter[@name="OrgHierarchyDatasets_diffgram"]//NewDataSet/hasChanges:PositionRoles/hasChanges:STATUS)[1]', 'varchar(1)') = '1'
DECLARE @XML xml =
'<request-broker-message version="1.0">
<request class="UPDATE_ORGANISATION_HIERARCHY" culture="tr-TR">
<parameter name="OrgHierarchyDatasets_schema">
(here is not important...)
</parameter>
<parameter name="OrgHierarchyDatasets_diffgram">
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet>
<PositionRoles diffgr:id="PositionRoles1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<POSTN_ID>0000-0000H1-POS</POSTN_ID>
<ROLE_ID>0000-00002B-ROL</ROLE_ID>
<STATUS>1</STATUS>
</PositionRoles>
</NewDataSet>
</diffgr:diffgram>
</parameter>
<parameter name="ExistNodeCheck" type="System.Boolean">True</parameter>
</request>
</request-broker-message>';
WITH XMLNAMESPACES ('urn:schemas-microsoft-com:xml-diffgram-v1' AS diffgr,
'urn:schemas-microsoft-com:xml-msdata' AS msdata)
SELECT dg.NDS.value('(PositionRoles/@diffgr:id)[1]','varchar(30)') AS id,
dg.NDS.value('(PositionRoles/@msdata:rowOrder)[1]','int') AS rowOrder,
dg.NDS.value('(PositionRoles/POSTN_ID/text())[1]','varchar(30)') AS POSTN_ID
FROM (VALUES(@XML))V(X)
CROSS APPLY V.X.nodes('request-broker-message/request/parameter/diffgr:diffgram/NewDataSet') dg(NDS);