Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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存储过程中从xml获取值_Sql_Sql Server_Xml_Stored Procedures - Fatal编程技术网

在SQL存储过程中从xml获取值

在SQL存储过程中从xml获取值,sql,sql-server,xml,stored-procedures,Sql,Sql Server,Xml,Stored Procedures,我试图从存储过程中的XML中获取一个元素,如下所示 USE [ION] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[AddToCustomer] (@id VARCHAR(20)) AS BEGIN DECLARE @xx xml DECLARE @custname v

我试图从存储过程中的XML中获取一个元素,如下所示

     USE [ION]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE  [dbo].[AddToCustomer]
        (@id VARCHAR(20))
    AS
    BEGIN
        DECLARE @xx xml
        DECLARE @custname varchar(8000)
        DECLARE @fid varchar(20)
        SET NOCOUNT ON;

        SELECT @fid=[C_ID], @xx=cast([C_XML] as xml) FROM [ION].[dbo].[COR_INBOX_ENTRY] WHERE [C_WAS_PROCESSED]=0 and [C_ID]=@id

        if(@@ROWCOUNT!=0)
        BEGIN

            SELECT @xx.value('(/SyncMESCustomer/ApplicationArea/Sender/ConfirmationCode)[1]', 'varchar(100)')
        END

    END
<SyncMESCustomer xmlns="http://schema.infor.com/InforOAGIS/2" xmlns:xs="http://www.w3.org/2001/XMLSchema" languageCode="GB" releaseID="9.2" systemEnvironmentCode="Production" versionID="2.9.1">
    <ApplicationArea>
        <Sender>
            <LogicalID schemeVersionID="15.4.0.0">lid://infor.m3be.ipc_mec_dev</LogicalID>
            <ComponentID schemeVersionID="MCP2-1514-02">M3BE</ComponentID>
            <ConfirmationCode>OnError</ConfirmationCode>
        </Sender>
        <CreationDateTime>2017-06-09T13:41:36.996Z</CreationDateTime>
        <BODID>5cfa6949-11ef-41dc-a380-4cc79f2687cc</BODID>
    </ApplicationArea>
    <DataArea>
        <Sync>
            <TenantID>TEST</TenantID>
            <AccountingEntityID>1_001</AccountingEntityID>
            <ActionCriteria>
                <ActionExpression actionCode="Replace" />
            </ActionCriteria>
        </Sync>
        <MESCustomer>
            <CUSTOMER_NO>TEST6</CUSTOMER_NO>
            <ipc_CSS_CUST_CUST_NAME>
                <CUSTOMER_NO>TEST6</CUSTOMER_NO>
                <CUST_NAME>Hawaii Inc_MES</CUST_NAME>
                <STATUS_DATE>20170609</STATUS_DATE>
                <STATUS_WORD>20</STATUS_WORD>
            </ipc_CSS_CUST_CUST_NAME>
            <STATUS_WORD>20</STATUS_WORD>
        </MESCustomer>
    </DataArea>
</SyncMESCustomer>
我非常确定变量@xx是用xml加载的。我需要选择“/SyncMESCustomer/ApplicationArea/Sender/ConfirmationCode”的值,但它返回空值

示例xml如下所示

     USE [ION]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE  [dbo].[AddToCustomer]
        (@id VARCHAR(20))
    AS
    BEGIN
        DECLARE @xx xml
        DECLARE @custname varchar(8000)
        DECLARE @fid varchar(20)
        SET NOCOUNT ON;

        SELECT @fid=[C_ID], @xx=cast([C_XML] as xml) FROM [ION].[dbo].[COR_INBOX_ENTRY] WHERE [C_WAS_PROCESSED]=0 and [C_ID]=@id

        if(@@ROWCOUNT!=0)
        BEGIN

            SELECT @xx.value('(/SyncMESCustomer/ApplicationArea/Sender/ConfirmationCode)[1]', 'varchar(100)')
        END

    END
<SyncMESCustomer xmlns="http://schema.infor.com/InforOAGIS/2" xmlns:xs="http://www.w3.org/2001/XMLSchema" languageCode="GB" releaseID="9.2" systemEnvironmentCode="Production" versionID="2.9.1">
    <ApplicationArea>
        <Sender>
            <LogicalID schemeVersionID="15.4.0.0">lid://infor.m3be.ipc_mec_dev</LogicalID>
            <ComponentID schemeVersionID="MCP2-1514-02">M3BE</ComponentID>
            <ConfirmationCode>OnError</ConfirmationCode>
        </Sender>
        <CreationDateTime>2017-06-09T13:41:36.996Z</CreationDateTime>
        <BODID>5cfa6949-11ef-41dc-a380-4cc79f2687cc</BODID>
    </ApplicationArea>
    <DataArea>
        <Sync>
            <TenantID>TEST</TenantID>
            <AccountingEntityID>1_001</AccountingEntityID>
            <ActionCriteria>
                <ActionExpression actionCode="Replace" />
            </ActionCriteria>
        </Sync>
        <MESCustomer>
            <CUSTOMER_NO>TEST6</CUSTOMER_NO>
            <ipc_CSS_CUST_CUST_NAME>
                <CUSTOMER_NO>TEST6</CUSTOMER_NO>
                <CUST_NAME>Hawaii Inc_MES</CUST_NAME>
                <STATUS_DATE>20170609</STATUS_DATE>
                <STATUS_WORD>20</STATUS_WORD>
            </ipc_CSS_CUST_CUST_NAME>
            <STATUS_WORD>20</STATUS_WORD>
        </MESCustomer>
    </DataArea>
</SyncMESCustomer>

lid://infor.m3be.ipc_mec_dev
M3BE
一个错误
2017-06-09T13:41:36.996Z
5cfa6949-11ef-41dc-a380-4cc79f2687cc
试验
1_001
测试6
测试6
夏威夷公司
20170609
20
20
提前谢谢

;WITH XMLNAMESPACES(DEFAULT 'http://schema.infor.com/InforOAGIS/2','http://www.w3.org/2001/XMLSchema' as ns0)
Select @XML.value('SyncMESCustomer[1]/ApplicationArea[1]/Sender[1]/ConfirmationCode[1]','varchar(100)')
返回

OnError

这对我有用。。。您可以将另一个别名添加到命名空间

 <SyncMESCustomer xmlns:xz="http://schema.infor.com/InforOAGIS/2" xmlns:xs="http://www.w3.org/2001/XMLSchema" languageCode="GB" releaseID="9.2" systemEnvironmentCode="Production" versionID="2.9.1"

DECLARE @xx XML

SET @xx = '<SyncMESCustomer>
    <ApplicationArea>
        <Sender>
            <LogicalID schemeVersionID="15.4.0.0">lid://infor.m3be.ipc_mec_dev</LogicalID>
            <ComponentID schemeVersionID="MCP2-1514-02">M3BE</ComponentID>
            <ConfirmationCode>OnError</ConfirmationCode>
        </Sender>
        <CreationDateTime>2017-06-09T13:41:36.996Z</CreationDateTime>
        <BODID>5cfa6949-11ef-41dc-a380-4cc79f2687cc</BODID>
    </ApplicationArea>
    <DataArea>
        <Sync>
            <TenantID>TEST</TenantID>
            <AccountingEntityID>1_001</AccountingEntityID>
            <ActionCriteria>
                <ActionExpression actionCode="Replace" />
            </ActionCriteria>
        </Sync>
        <MESCustomer>
            <CUSTOMER_NO>TEST6</CUSTOMER_NO>
            <ipc_CSS_CUST_CUST_NAME>
                <CUSTOMER_NO>TEST6</CUSTOMER_NO>
                <CUST_NAME>Hawaii Inc_MES</CUST_NAME>
                <STATUS_DATE>20170609</STATUS_DATE>
                <STATUS_WORD>20</STATUS_WORD>
            </ipc_CSS_CUST_CUST_NAME>
            <STATUS_WORD>20</STATUS_WORD>
        </MESCustomer>
    </DataArea>
</SyncMESCustomer>'

SELECT 
    xmlData.A.value('./ConfirmationCode[1]', 'varchar(100)')
FROM @xx.nodes('/SyncMESCustomer/ApplicationArea/Sender') xmlData(A);

Woww。。非常感谢@John。它起作用了。您能帮助我理解XMLNAMESPACES的功能吗?老实说,这是因为其他名称空间没有默认名称空间或别名。。。如果只添加一个别名,效果就很好。@NikhilDominic看起来链接被删除了。。。