我想从xml输入参数创建一个临时表。 这是我的XML:
<Offices>
<Group id="22807">
<Office>185901</Office>
<Office>185902</Office>
<Office>185944</Office>
</Group>
</Offices>
这是我的SQL:
DECLARE @GroupsOfficeIDs xml
SET @GroupsOfficeIDs = '<Offices><Group id="22807"><Office>185901</Office><Office>185902</Office><Office>185944</Office></Group></Offices>'
CREATE TABLE #GroupOfficeID (PK int primary key identity(1,1), IdXml xml)
INSERT INTO #GroupOfficeID VALUES (@GroupsOfficeIDs)
SELECT PK,
group.ref.value('@id', 'int') AS GroupID,
group.ref.value('(Office/text())[1]', 'varchar(20)') AS OfficeID
FROM #GroupOfficeID go cross apply go.IdXml.nodes('/Offices/Group') group(ref)
返回1行:
PK GroupID OfficeID
1 22807 185901
我希望它返回以下内容:
PK GroupID OfficeID
1 22807 185901
2 22807 185902
3 22807 185944
我的XML是错的还是我的查询? 谢谢!
更新 我有点进一步...... 我现在的疑问是:
DECLARE @GroupsOfficeIDs xml
SET @GroupsOfficeIDs = '<Offices><Group id="22807"><Office>185901</Office><Office>185902</Office><Office>185944</Office></Group></Offices>'
CREATE TABLE #GroupOfficeID (PK int primary key identity(1,1), IdXml xml)
INSERT INTO #GroupOfficeID VALUES (@GroupsOfficeIDs)
SELECT PK,
group.ref.value('@id', 'int') AS GroupID,
office.ref.value('(Office/text())[1]', 'varchar(20)') AS OfficeID
FROM #GroupOfficeID go cross apply go.IdXml.nodes('/Offices/Group') group(ref)
cross apply go.IdXml.nodes('/Offices/Group/Office') as office(ref)
它产生了这个:
PK GroupID OfficeID
1 22807 185901
1 22807 185902
1 22807 185944
为什么主键增量不是1?
答案 0 :(得分:1)
CREATE TABLE #GroupOfficeID (PK int primary key identity(1,1), IdXml xml)
-- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- here you associate one XML data to one identity id
的值相同,因为临时表将一个XML数据存储在一行中,只有一个PK,这意味着来自同一XML源的所有数据都将具有相同的主键:
GroupID
您可能希望更改临时表结构,以将一个OfficeID
- CREATE TABLE #GroupOfficeID (PK int primary key identity(1,1), GroupID int, OfficeID int)
组合存储为一行:
GO
然后插入的查询就像这样(避免使用像GROUP
和INSERT INTO #GroupOfficeID(GroupID,OfficeID)
SELECT
g.value('@id','int') GroupID,
o.value('.','int') OfficeID
FROM @GroupsOfficeIDs.nodes('/Offices/Group') grp(g)
CROSS APPLY g.nodes('Office') office(o)
这样的关键字作为别名!):
SELECT * FROM #GroupOfficeID
然后PK GroupID OfficeID
1 22807 185901
2 22807 185902
3 22807 185944
将产生正确的预期结果:
{{1}}
<强> SQL Fiddle Demo 强>