使用 Hear 和 Node 值从 SQL 服务器读取 XML 数据
Reading XML data from SQL Server with Hear and Node values
我在一个文件中有以下 XML 数据 "Test1.xml":
<TextValuess>
<TextValues Name="Value1" Override="true" Type="String">
<DEV>Source=DEV;Catalog=DEV_DMT;Integrated Security=SSPI;</DEV>
<INT10>Source=LAB;Catalog=TST_INT10;Integrated Security=SSPI;</INT10>
<INT>Source=LAB1;Catalog=TST_INT1;Integrated Security=SSPI;</INT>
<INT2>Source=LAB10;Catalog=TST_INT12;Integrated Security=SSPI;</INT2>
</TextValues>
<TextValues Name="ENVIRONMENT" Override="true" Type="String">
<DEV>DEV</DEV>
<INT10>INT10</INT10>
<INT>INT1</INT>
<INT2>INT15</INT2>
</TextValues>
</TextValuess>
我正在尝试读取 <TextValues>
标签的 INT10 值和名称。我在 SQL Server:
中需要如下输出
Name Value
---- -----
Value1 LAB
Environment INT10
我已尝试使用这些 SQL 语句。我能够获得 Name
值或 INT10
值。
声明 1:
select c3.value('INT10[1]','varchar(50)')
from
(select cast(c1 as xml)
from OPENROWSET (BULK 'D:\Tasks\Test1.xml',SINGLE_BLOB) as T1(c1)) as T2(c2)
cross apply c2.nodes('/TextValuess/TextValues') T3(c3)
有了这个,我能够检索 INT10
的值
声明 2:
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
SELECT @XML = ' <TextValuess>
<TextValues Name="Value1" Override="true" Type="String">
<DEV>Source=DEV;Catalog=DEV_DMT;Integrated Security=SSPI;</DEV>
<INT10>Source=LAB;Catalog=TST_INT10;Integrated Security=SSPI;</INT10>
<INT>Source=LAB1;Catalog=TST_INT1;Integrated Security=SSPI;</INT>
<INT2>Source=LAB10;Catalog=TST_INT12;Integrated Security=SSPI;</INT2>
</TextValues>
<TextValues Name="ENVIRONMENT" Override="true" Type="String">
<DEV>DEV</DEV>
<INT10>INT10</INT10>
<INT>INT1</INT>
<INT2>INT15</INT2>
</TextValues>
</TextValuess>'
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT Name ,INT10
FROM OPENXML(@hDoc, 'TextValuess/TextValues/INT10')
WITH
(
Name [varchar](50) '../@Name',
INT10 [varchar](100) '../@INT10'
)
有了这个,我只能检索名称信息,但不能检索 INT10 值。
试试这个代码:
-- declare a XML variable
DECLARE @XmlInput XML;
-- load the XML from the file into that XML variable
SELECT @XmlInput = CAST(c1 AS XML)
FROM OPENROWSET (BULK 'D:\Tasks\Test1.xml',SINGLE_BLOB) AS T1(c1)
-- extract the "Name" attribute and "INT10" element from the XML
SELECT
Name = XC.value('@Name', 'varchar(50)'),
Int10Value = XC.value('(INT10)[1]', 'varchar(100)')
FROM
@XmlData.nodes('/TextValuess/TextValues') AS XT(XC)
使用内置的、更受欢迎的 XQuery 功能调用 .nodes()
(转储 OPENXML
东西 - 它是旧的和遗留的并且有内存泄漏 - XQuery 也更容易使用!) returns 一个 XML 片段的列表 - 一个片段对应文档中 XPath 表达式的每个匹配项(这里:一个对应根目录下的每个 <TextValues>
节点)。
然后你进入那个 XML 片段,并提取名称 attribute(使用 @Name
表达式)和第一个(也是唯一一个) <INT10>
子元素并将它们转换为 "regular" 值(具有由 .value()
调用的第二个参数定义的数据类型)
我在一个文件中有以下 XML 数据 "Test1.xml":
<TextValuess>
<TextValues Name="Value1" Override="true" Type="String">
<DEV>Source=DEV;Catalog=DEV_DMT;Integrated Security=SSPI;</DEV>
<INT10>Source=LAB;Catalog=TST_INT10;Integrated Security=SSPI;</INT10>
<INT>Source=LAB1;Catalog=TST_INT1;Integrated Security=SSPI;</INT>
<INT2>Source=LAB10;Catalog=TST_INT12;Integrated Security=SSPI;</INT2>
</TextValues>
<TextValues Name="ENVIRONMENT" Override="true" Type="String">
<DEV>DEV</DEV>
<INT10>INT10</INT10>
<INT>INT1</INT>
<INT2>INT15</INT2>
</TextValues>
</TextValuess>
我正在尝试读取 <TextValues>
标签的 INT10 值和名称。我在 SQL Server:
Name Value
---- -----
Value1 LAB
Environment INT10
我已尝试使用这些 SQL 语句。我能够获得 Name
值或 INT10
值。
声明 1:
select c3.value('INT10[1]','varchar(50)')
from
(select cast(c1 as xml)
from OPENROWSET (BULK 'D:\Tasks\Test1.xml',SINGLE_BLOB) as T1(c1)) as T2(c2)
cross apply c2.nodes('/TextValuess/TextValues') T3(c3)
有了这个,我能够检索 INT10
的值声明 2:
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
SELECT @XML = ' <TextValuess>
<TextValues Name="Value1" Override="true" Type="String">
<DEV>Source=DEV;Catalog=DEV_DMT;Integrated Security=SSPI;</DEV>
<INT10>Source=LAB;Catalog=TST_INT10;Integrated Security=SSPI;</INT10>
<INT>Source=LAB1;Catalog=TST_INT1;Integrated Security=SSPI;</INT>
<INT2>Source=LAB10;Catalog=TST_INT12;Integrated Security=SSPI;</INT2>
</TextValues>
<TextValues Name="ENVIRONMENT" Override="true" Type="String">
<DEV>DEV</DEV>
<INT10>INT10</INT10>
<INT>INT1</INT>
<INT2>INT15</INT2>
</TextValues>
</TextValuess>'
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT Name ,INT10
FROM OPENXML(@hDoc, 'TextValuess/TextValues/INT10')
WITH
(
Name [varchar](50) '../@Name',
INT10 [varchar](100) '../@INT10'
)
有了这个,我只能检索名称信息,但不能检索 INT10 值。
试试这个代码:
-- declare a XML variable
DECLARE @XmlInput XML;
-- load the XML from the file into that XML variable
SELECT @XmlInput = CAST(c1 AS XML)
FROM OPENROWSET (BULK 'D:\Tasks\Test1.xml',SINGLE_BLOB) AS T1(c1)
-- extract the "Name" attribute and "INT10" element from the XML
SELECT
Name = XC.value('@Name', 'varchar(50)'),
Int10Value = XC.value('(INT10)[1]', 'varchar(100)')
FROM
@XmlData.nodes('/TextValuess/TextValues') AS XT(XC)
使用内置的、更受欢迎的 XQuery 功能调用 .nodes()
(转储 OPENXML
东西 - 它是旧的和遗留的并且有内存泄漏 - XQuery 也更容易使用!) returns 一个 XML 片段的列表 - 一个片段对应文档中 XPath 表达式的每个匹配项(这里:一个对应根目录下的每个 <TextValues>
节点)。
然后你进入那个 XML 片段,并提取名称 attribute(使用 @Name
表达式)和第一个(也是唯一一个) <INT10>
子元素并将它们转换为 "regular" 值(具有由 .value()
调用的第二个参数定义的数据类型)