我已经阅读了有关此主题的所有其他帖子,但没有一个对我有用。这是最近的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。
答案 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