Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在sql查询中解析多个名称空间xml_Sql Server_Tsql_Xpath_Xml Namespaces_Xquery Sql - Fatal编程技术网

Sql server 如何在sql查询中解析多个名称空间xml

Sql 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

我有一个包含XML列的表,我正试图从XML数据中获取某些列。这些列位于has
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);