我需要从XML获取数据:
DECLARE @input XML=
'<Data xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Data xmlns="http://test.com/xmlschema/Data_Schema.xsd">
<Person defID="414123">
<GlobalID Type="People" Code="112233" />
<FirstName>John</FirstName>
<LastName>Smith</LastName>
<Email>john.smith@testcompany.com</Email>
<Department>Sales</Department>
<CountryCode>US</CountryCode>
<CompanyName>Test Company</CompanyName>
</Person>
</Data>
</Data>';
我对XML结构无能为力,这是我已经尝试的方法:
WITH XMLNAMESPACES('http://test.com/xmlschema/Data_Schema.xsd' AS x1)
SELECT [Email] = PersonLevel.value('(Email)[1]', 'nvarchar(64)'),
[FirstName] = PersonLevel.value('(FirstName)[1]', 'nvarchar(64)'),
[LastName] = PersonLevel.value('(LastName)[1]', 'nvarchar(64)'),
[Department] = PersonLevel.value('(Department)[1]', 'nvarchar(64)'),
[CountryCode] = PersonLevel.value('(CountryCode)[1]', 'nvarchar(64)'),
[CompanyName] = PersonLevel.value('(CompanyName)[1]', 'nvarchar(64)')
FROM @Input.nodes('/Data/x1:Data/x1:Person') AS XT1(PersonLevel);
我的查询结果为NULL值,我在做什么错了?
答案 0 :(得分:1)
您需要在value
表达式中包含名称空间:
WITH XMLNAMESPACES ('http://test.com/xmlschema/Data_Schema.xsd' AS x1)
SELECT PersonLevel.value('(x1:Email)[1]', 'nvarchar(64)') AS [Email],
PersonLevel.value('(x1:FirstName)[1]', 'nvarchar(64)') AS [FirstName],
PersonLevel.value('(x1:LastName)[1]', 'nvarchar(64)') AS [LastName],
PersonLevel.value('(x1:Department)[1]', 'nvarchar(64)') AS [Department],
PersonLevel.value('(x1:CountryCode)[1]', 'nvarchar(64)') AS [CountryCode],
PersonLevel.value('(x1:CompanyName)[1]', 'nvarchar(64)') AS [CompanyName]
FROM @input.nodes('/Data/x1:Data/x1:Person') AS XT1(PersonLevel);
换句话说,您真的需要一切都成为nvarchar(64)
吗?我建议64个字符可能不足以用于一个电子邮件地址(当企业拥有长域名,带有子域和全名地址时,我有时会看到一些非常愚蠢的字符),但是64个Unicode字符是国家/地区代码的62个字符(由2个ASCII字符组成)。您可能要在这里重新考虑数据类型。