返回多个节点的xml查询帮助
我已经使用SQL很长时间了,但是新系统需要我学习XQuery 我已经进行了很好的搜索,但实际上找不到这个问题的新手答案,我正在尝试查询一个XML字段以返回多行数据,其中一个客户机有多个电话号码。XML字段存储在客户端级别,格式如下:返回多个节点的xml查询帮助,xml,sql-server-2008,xquery,Xml,Sql Server 2008,Xquery,我已经使用SQL很长时间了,但是新系统需要我学习XQuery 我已经进行了很好的搜索,但实际上找不到这个问题的新手答案,我正在尝试查询一个XML字段以返回多行数据,其中一个客户机有多个电话号码。XML字段存储在客户端级别,格式如下: <p1:Telephone> <p1:Type code="Home">Home</p1:Type> <p1:TelephoneNumber>01234 987654</p1:Telep
<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>
有人能为我指出正确的方向吗
非常感谢,
Jon您尚未包含完整的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
返回:
类型、代码、电话号码
家,家,012349876
Business,Business,01324 1234您可以像这样使用新的XML数据类型,假设XML与提供的答案类似,并且您的表有一个ClientName列和一个XMLCol列 编辑
谢谢openshac,这就成功了。我将进一步调查这些程序。它可以通过一系列交叉应用程序来实现,还是我不应该去的地方?谢谢Mikael,我想我们离得越来越近了,我已经稍微调整了查询,以适应xml中更高级别的结构,称为CommunicaionChannel。当我跑的时候对不起,当我跑的时候;将xmlnamespace作为p1选择X.ClientReference,将T.N.value'p1:Type[1]/@code',将varchar25'作为TypeCode,将T.N.value'p1:Type[1]',将varchar25'作为TypeValue,-T.N.value'p1:TelephoneNumber[1]',将varchar25'作为tempa中的电话号码作为X交叉应用X.[Xml].nodes“//p1:CommunicationChannel/p1:Telephone”作为TN,我得到一个错误:操作数数据类型varchar对于减号运算符无效。如果我将TypeCode和TypeValue签出,则查询运行正常,有什么想法吗?@user您有几个输入错误。一太多,太多。用你的版本更新了答案。谢谢,我找到了;。问题就在这里。现在一切都好了,谢谢你的帮助help@user真为你高兴。看看这个关于接受答案是如何工作的。
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
;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)