如何从 SQL 服务器中的 XML 列获取数据?
How to get data from XML column in SQL Server?
我在 SQL 服务器数据库中有一个 XML
列。我想从该列中获得结果。 XML 列如下所示:
<ArrayOfTarget xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TriTech.InformRMS.Domain.Core.ComplexTypes">
<Target>
<AgencyId i:nil="true" />
<AgencyName i:nil="true" />
<Id i:nil="true" />
<Name>Quick Search</Name>
<Type>Search</Type>
</Target>
<Target>
<AgencyId i:nil="true" />
<AgencyName i:nil="true" />
<Id i:nil="true" />
<Name>Quick Search = wbinc2000125</Name>
<Type>Quick Search</Type>
</Target>
<Target>
<AgencyId i:nil="true" />
<AgencyName i:nil="true" />
<Id i:nil="true" />
<Name>Results (0)</Name>
<Type>Result</Type>
</Target>
</ArrayOfTarget>
以下是我尝试过但没有结果的一些方法:
select
[XML].value ('(ArrayofTarget/Target/Name/node())[1]', 'nvarchar(max)') as Results
from
[DB].[dbo].[Table]
另一个例子:
;WITH XMLNAMESPACES (N'http://www.w3.org/2001/XMLSchema-instance' as X)
SELECT
[XML].value('(/X:ArrayOfTarget/X:Target/X:Name[1]', 'nvarchar(max)') as Name
FROM [DB].[dbo].[Table]
这是一个工作示例。
它展示了如何正确处理 默认命名空间 以及如何使用两个 XQuery 方法:.nodes()
和 .value()
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<ArrayOfTarget xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/TriTech.InformRMS.Domain.Core.ComplexTypes">
<Target>
<AgencyId i:nil="true"/>
<AgencyName i:nil="true"/>
<Id i:nil="true"/>
<Name>Quick Search</Name>
<Type>Search</Type>
</Target>
<Target>
<AgencyId i:nil="true"/>
<AgencyName i:nil="true"/>
<Id i:nil="true"/>
<Name>Quick Search = wbinc2000125</Name>
<Type>Quick Search</Type>
</Target>
<Target>
<AgencyId i:nil="true"/>
<AgencyName i:nil="true"/>
<Id i:nil="true"/>
<Name>Results (0)</Name>
<Type>Result</Type>
</Target>
</ArrayOfTarget>');
-- DDL and sample data population, end
;WITH XMLNAMESPACES (DEFAULT 'http://schemas.datacontract.org/2004/07/TriTech.InformRMS.Domain.Core.ComplexTypes')
SELECT c.value('(Name/text())[1]', 'VARCHAR(30)') AS [Name]
, c.value('(Type/text())[1]', 'VARCHAR(30)') AS [Type]
FROM @tbl CROSS APPLY xmldata.nodes('/ArrayOfTarget/Target') AS t(c);
输出
+-----------------------------+--------------+
| Name | Type |
+-----------------------------+--------------+
| Quick Search | Search |
| Quick Search = wbinc2000125 | Quick Search |
| Results (0) | Result |
+-----------------------------+--------------+
我在 SQL 服务器数据库中有一个 XML
列。我想从该列中获得结果。 XML 列如下所示:
<ArrayOfTarget xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TriTech.InformRMS.Domain.Core.ComplexTypes">
<Target>
<AgencyId i:nil="true" />
<AgencyName i:nil="true" />
<Id i:nil="true" />
<Name>Quick Search</Name>
<Type>Search</Type>
</Target>
<Target>
<AgencyId i:nil="true" />
<AgencyName i:nil="true" />
<Id i:nil="true" />
<Name>Quick Search = wbinc2000125</Name>
<Type>Quick Search</Type>
</Target>
<Target>
<AgencyId i:nil="true" />
<AgencyName i:nil="true" />
<Id i:nil="true" />
<Name>Results (0)</Name>
<Type>Result</Type>
</Target>
</ArrayOfTarget>
以下是我尝试过但没有结果的一些方法:
select
[XML].value ('(ArrayofTarget/Target/Name/node())[1]', 'nvarchar(max)') as Results
from
[DB].[dbo].[Table]
另一个例子:
;WITH XMLNAMESPACES (N'http://www.w3.org/2001/XMLSchema-instance' as X)
SELECT
[XML].value('(/X:ArrayOfTarget/X:Target/X:Name[1]', 'nvarchar(max)') as Name
FROM [DB].[dbo].[Table]
这是一个工作示例。
它展示了如何正确处理 默认命名空间 以及如何使用两个 XQuery 方法:.nodes()
和 .value()
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<ArrayOfTarget xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/TriTech.InformRMS.Domain.Core.ComplexTypes">
<Target>
<AgencyId i:nil="true"/>
<AgencyName i:nil="true"/>
<Id i:nil="true"/>
<Name>Quick Search</Name>
<Type>Search</Type>
</Target>
<Target>
<AgencyId i:nil="true"/>
<AgencyName i:nil="true"/>
<Id i:nil="true"/>
<Name>Quick Search = wbinc2000125</Name>
<Type>Quick Search</Type>
</Target>
<Target>
<AgencyId i:nil="true"/>
<AgencyName i:nil="true"/>
<Id i:nil="true"/>
<Name>Results (0)</Name>
<Type>Result</Type>
</Target>
</ArrayOfTarget>');
-- DDL and sample data population, end
;WITH XMLNAMESPACES (DEFAULT 'http://schemas.datacontract.org/2004/07/TriTech.InformRMS.Domain.Core.ComplexTypes')
SELECT c.value('(Name/text())[1]', 'VARCHAR(30)') AS [Name]
, c.value('(Type/text())[1]', 'VARCHAR(30)') AS [Type]
FROM @tbl CROSS APPLY xmldata.nodes('/ArrayOfTarget/Target') AS t(c);
输出
+-----------------------------+--------------+
| Name | Type |
+-----------------------------+--------------+
| Quick Search | Search |
| Quick Search = wbinc2000125 | Quick Search |
| Results (0) | Result |
+-----------------------------+--------------+