SQL Сервер: SELECT XML с пространствами имен дает результат NULL - PullRequest
0 голосов
/ 28 мая 2020

это мой первый пост, так что надеюсь, я смогу предоставить всю необходимую информацию, чтобы понять мою проблему. Я хочу загрузить файл XML на SQL -Server 2012 в качестве переменной, один из столбцов должен содержать сам XML, а другие столбцы должны содержать значения из элементов XML. Моя проблема в том, что я не получаю ОШИБКУ, но также нет записи в моей таблице, она просто вернула пустой результат

USE [testjrazt]
GO
DECLARE @doc XML
SELECT @doc = '<?xml version="1.0"?>
<SyncSalesOrder xmlns="http://schema.infor.com/InforOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schema.infor.com/InforOAGIS/2 http://schema.infor.com/2.12.x/InforOAGIS/BODs/SyncSalesOrder.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" releaseID="9.2" versionID="2.12.x">
    <ApplicationArea>
        <Sender>
            <LogicalID>lid://infor.ln.dach_nausveln1_200_2</LogicalID>
            <ComponentID>erp</ComponentID>
            <ConfirmationCode>OnError</ConfirmationCode>
        </Sender>
        <CreationDateTime>2019-12-02T15:47:42Z</CreationDateTime>
        <BODID>infor-nid:infor:200::AA0000008:?SalesOrder&amp;verb=Sync</BODID>
    </ApplicationArea>
    <DataArea>
        <Sync>
            <TenantID>infor</TenantID>
            <AccountingEntityID>200</AccountingEntityID>
            <LocationID>
        </LocationID>
        <ActionCriteria>
            <ActionExpression actionCode="Add"/>
        </ActionCriteria>
    </Sync>
    <SalesOrder>
        --CUT FOR BETTER READABILITY 
    </SalesOrder>
</DataArea>
</SyncSalesOrder>
'
--Inserting into COR_Outbox_Entry Tabelle -> I/O BOX 
/*
INSERT INTO [dbo].[COR_OUTBOX_ENTRY]
           ([C_XML]
           ,[C_TENANT_ID]
           ,[C_MESSAGE_PRIORITY] 
           ,[C_CREATED_DATE_TIME]
           ,[C_WAS_PROCESSED]
           ,[C_LOGICAL_ID])
*/
--Only SELECT to check if data get loaded from XML - BLANK RESULT 
     SELECT 
        i_xml = CAST (@doc AS varbinary(max)),
        i_tenant_id = xdoc.value('(DataArea/Sync/TenantID)[1]','nvarchar(250)'), -- xpath /SyncSalesOrder/DataArea/Sync/TenantID
        --i_message_priority =xdoc.value('()[1]','int'),
        i_created_date_time = xdoc.value('(ApplicationArea/CreationDateTime)[1]','datetime'),
        --i_was_processed = xdoc.value('()[1]','int'),
        i_lid = xdoc.value('(ApplicationArea/Sender/LogicalID)[1]','nvarchar(250)')
     FROM @doc.nodes('SyncSalesOrder') AS InputTable(xdoc)

1 Ответ

0 голосов
/ 28 мая 2020

Вот как это сделать. Ваш XML имеет пространство имен по умолчанию. Это необходимо учитывать в пункте WITH XMLNAMESPACES.

SQL

-- DDL and sample data population, start
DECLARE @doc XML = 
N'<SyncSalesOrder xmlns="http://schema.infor.com/InforOAGIS/2"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://schema.infor.com/InforOAGIS/2 http://schema.infor.com/2.12.x/InforOAGIS/BODs/SyncSalesOrder.xsd"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema" releaseID="9.2"
                versionID="2.12.x">
    <ApplicationArea>
        <Sender>
            <LogicalID>lid://infor.ln.dach_nausveln1_200_2</LogicalID>
            <ComponentID>erp</ComponentID>
            <ConfirmationCode>OnError</ConfirmationCode>
        </Sender>
        <CreationDateTime>2019-12-02T15:47:42Z</CreationDateTime>
        <BODID>infor-nid:infor:200::AA0000008:?SalesOrder&amp;verb=Sync</BODID>
    </ApplicationArea>
    <DataArea>
        <Sync>
            <TenantID>infor</TenantID>
            <AccountingEntityID>200</AccountingEntityID>
            <LocationID>
            </LocationID>
            <ActionCriteria>
                <ActionExpression actionCode="Add"/>
            </ActionCriteria>
        </Sync>
        <SalesOrder>--CUT FOR BETTER READABILITY</SalesOrder>
    </DataArea>
</SyncSalesOrder>';

DECLARE @COR_OUTBOX_ENTRY TABLE ([C_XML] XML
           ,[C_TENANT_ID] NVARCHAR(250)
           --,[C_MESSAGE_PRIORITY] 
           ,[C_CREATED_DATE_TIME] DATETIME
           --,[C_WAS_PROCESSED]
           ,[C_LOGICAL_ID] NVARCHAR(250));
-- DDL and sample data population, end

;WITH XMLNAMESPACES (DEFAULT 'http://schema.infor.com/InforOAGIS/2')
INSERT INTO @COR_OUTBOX_ENTRY
           ([C_XML]
           ,[C_TENANT_ID]
           --,[C_MESSAGE_PRIORITY] 
           ,[C_CREATED_DATE_TIME]
           --,[C_WAS_PROCESSED]
           ,[C_LOGICAL_ID])
SELECT  @doc AS i_xml
    , i_tenant_id = c.value('(DataArea/Sync/TenantID/text())[1]','nvarchar(250)')
--i_message_priority =xdoc.value('()[1]','int'),
    , i_created_date_time = c.value('(ApplicationArea/CreationDateTime/text())[1]','datetime')
--i_was_processed = xdoc.value('()[1]','int'),
    , i_lid = c.value('(ApplicationArea/Sender/LogicalID/text())[1]','nvarchar(250)')
FROM @doc.nodes('/SyncSalesOrder') AS t(c);

-- test
SELECT * FROM @COR_OUTBOX_ENTRY;
...