SQL 2008:从nvarchar(max)中提取XML

时间:2015-09-16 13:20:18

标签: sql-server xml sql-server-2008

我已经阅读了有关此主题的所有其他帖子,但没有一个对我有用。这是最近的CONVERTING SQL NVARCHAR(MAX) TO XML

所以,我已修改该代码以尝试适应我的情况。我有一个nvarchar(max)列,其中包含XML数据作为一个大的长字符串。它不是我的数据库,因此我无法将数据类型更改为XML。接下来最好的事情是创建一个查询并将其转换为XML。这是我的代码:

IF OBJECT_ID('tempdb..#XML_Dummy') IS NOT NULL DROP TABLE #XML_Dummy

GO

CREATE TABLE #XML_Dummy
        (
            [ID] [INT] IDENTITY(1, 1)
                                 NOT NULL ,
            [XMLValue] [NVARCHAR](MAX) NULL
        );         
GO
INSERT  INTO #XML_Dummy
                ( 
                    [XMLValue]
                )
select top 10 xmlcol from MyTable

GO  

SELECT
        b.x.value('(/Proponix/Header/SubHeader/InstrumentID)[1]', 'varchar(max)')
FROM
        #XML_Dummy a
        CROSS APPLY (
                                    SELECT
                                     CAST(CAST ([XMLValue] AS VARCHAR(MAX)) AS XML) x
                                ) b;
IF OBJECT_ID('tempdb..#XML_Dummy') IS NOT NULL DROP TABLE #XML_Dummy;   

我不知道为什么我要把所有的NULLS都拿回来。我想返回InstrumentID。以下是我的XML摘录:

<?xml version="1.0"?>
<Proponix>
    <Header>
        Header stuff
    </Header>
    <SubHeader>
        <InstrumentID>BS6000000001</InstrumentID>
    </SubHeader>
    A lot more fields

我错过了什么?这是我第一次在SQL服务器中使用XML。

2 个答案:

答案 0 :(得分:2)

在您的示例中,SubHeader不是Header的子节点。尝试:

b.x.value('(/Proponix/SubHeader/InstrumentID)[1]', 'varchar(max)')

答案 1 :(得分:1)

你试图找到SubHeader作为Header的孩子,但它是一个兄弟......

试试这个:

编辑:更改@x以模拟包含不同xml_msg值的nvarchar列的表:

EDIT2:根据OP在聊天中显示的电话进行调整

WITH ConvertedToXML AS 
( 
SELECT xml_msg AsVarchar 
,CAST(xml_msg AS XML) AS AsXml 
FROM myTable 
) 
SELECT ConvertedToXML.AsVarchar 
,ConvertedToXML.AsXml 
,ConvertedToXML.AsXml.value('(/Proponix/SubHeader/InstrumentID)[1]', 'varchar(max)') AS InstrumentID 
FROM ConvertedToXML

- 旧文字

    declare @x table(xml_msg nvarchar(max));
insert into @x VALUES
('<?xml version="1.0"?>
<Proponix>
    <Header>
        Header stuff
    </Header>
    <SubHeader>
        <InstrumentID>BS6000000001</InstrumentID>
    </SubHeader>
</Proponix>')
,('<?xml version="1.0"?>
<Proponix>
    <Header>
        Header stuff
    </Header>
    <SubHeader>
        <InstrumentID>BS6000000002</InstrumentID>
    </SubHeader>
</Proponix>')
,('<?xml version="1.0"?>
<Proponix>
    <Header>
        Header stuff
    </Header>
    <SubHeader>
        <InstrumentID>BS6000000003</InstrumentID>
    </SubHeader>
</Proponix>');

WITH ConvertedToXML AS
(
    SELECT TOP 10 CAST(xml_msg AS XML) AS AsXml FROM @x
)
SELECT
        ConvertedToXML.AsXml.value('(/Proponix/SubHeader/InstrumentID)[1]', 'varchar(max)')
FROM ConvertedToXML