我一直在使用SQL很长一段时间,但新系统要求我学习XQuery。
我有一个很好的搜索,但无法真正找到这个新手答案,我正在尝试查询XML字段,以返回客户端有多个电话号码的多行数据。 XML字段存储在客户端级别,格式为:
<p1:Telephone>
<p1:Type code="Home">Home</p1:Type>
<p1:TelephoneNumber>01234 987654</p1:TelephoneNumber>
</p1:Telephone>
<p1:Telephone>
<p1:Type code="Business">Business</p1:Type>
<p1:TelephoneNumber>01324 123456</p1:TelephoneNumber>
</p1:Telephone>
客户端的详细信息在XML之上,但这是我正在努力解决的问题。
我想要的是将数据作为不同的列返回查询分析器,即
Client A | Home | 01234 987654
Client A | Business | 01324 1234546
Client B | .... | ....
有人能指出我正确的方向吗?
非常感谢,
乔恩
答案 0 :(得分:2)
您可以使用这样的新XML数据类型,假设XML在openshac提供的答案中显示,而YourTable
有一个ClientName
列和一个XMLCol
列
;with xmlnamespaces ('http://org.test' as p1)
select X.ClientName,
T.N.value('p1:Type[1]/@code', 'varchar(25)') as TypeCode,
T.N.value('p1:Type[1]', 'varchar(25)') as TypeValue,
T.N.value('p1:TelephoneNumber[1]', 'varchar(25)') as TelephoneNumber
from YourTable as X
cross apply X.XMLCol.nodes('/root/p1:Telephone') as T(N)
修改强>
;with xmlnamespaces ('f2.co.uk/f2/1.0' as p1)
select X.ClientReference,
T.N.value('p1:Type[1]/@code', 'varchar(25)') as TypeCode,
T.N.value('p1:Type[1]', 'varchar(25)') as TypeValue,
T.N.value('p1:TelephoneNumber[1]', 'varchar(25)') as TelephoneNumber
from #tempa as X
cross apply X.[Xml].nodes('//p1:CommunicationChannel/p1:Telephone') AS T(N)
答案 1 :(得分:0)
您尚未包含完整的XML,因此我无法看到您从哪里获取客户信息,但请尝试以下操作:
DECLARE @xml nvarchar(max) = '<root xmlns:p1="http://org.test">
<p1:Telephone>
<p1:Type code="Home">Home</p1:Type>
<p1:TelephoneNumber>01234 987654</p1:TelephoneNumber>
</p1:Telephone>
<p1:Telephone>
<p1:Type code="Business">Business</p1:Type>
<p1:TelephoneNumber>01324 123456</p1:TelephoneNumber>
</p1:Telephone></root>'
DECLARE @xml_handle int
EXEC sp_XML_preparedocument @xml_handle OUTPUT, @xml, '<root xmlns:p1="http://org.test" />'
SELECT * FROM
OPENXML( @xml_handle, '//p1:Telephone')
WITH (
[Type] varchar(10) './p1:Type',
[Code] varchar(10) './p1:Type/@code',
[TelephoneNumber] varchar(10) './p1:TelephoneNumber'
)
EXEC sp_xml_removedocument @xml_handle
返回:
<强>类型,代码,TelephoneNumber 强>
Home,Home,01234 9876
商业,商业,01324 1234