假设我已将xml存储在数据库中.它包含一个联系人列表,如下所示:
<Person>
<Name>Irwin</Name>
<Address>Home, In a place</Address>
<Contact type="mobile">7771234</Contact>
<Contact type="home">6311234</Contact>
<Contact type="work">6352234</Contact>
<Contact type="fax">6352238</Contact>
</Person>
Run Code Online (Sandbox Code Playgroud)
它存储在sql server数据库的xml列中,具有以下结构:
TABLE [Contacts](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[Info] [xml] NOT NULL,
[Status] [tinyint] NOT NULL,
[CreateTime] [datetime] NOT NULL,
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我想编写一个查询,将Contact元素转换为新表的行,与Contacts表的ID字段匹配.
我试过这个:
SELECT Cast(Request.query('/Person/Contact/text()') as varchar(100)) as [Number], ID
FROM Contacts
Run Code Online (Sandbox Code Playgroud)
但它从列中的给定xml片段中提取所有数据,并将其与该行的ID一起放在一行中,如下所示:
编号,ID
7771234631123463522346352238,1500
当我想得到的是这个:
编号,ID
7771234,1500
6311234,1500
6352234,1500
6352238,1500
你能为我指出正确的方向吗?
使用CROSS APPLY和xml方法
DECLARE @t TABLE ( ID INT, tag XML )
INSERT INTO @t
( ID ,
tag
)
VALUES ( 1500 , -- ID - int
'<Person>
<Name>Irwin</Name>
<Address>Home, In a place</Address>
<Contact type="mobile">7771234</Contact>
<Contact type="home">6311234</Contact>
<Contact type="work">6352234</Contact>
<Contact type="fax">6352238</Contact>
</Person>'
)
SELECT Number = Contact.value('.', 'varchar(MAX)') ,
t.id
FROM @t t
CROSS APPLY tag.nodes('/Person/Contact') AS tag ( Contact )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4693 次 |
| 最近记录: |