sql server 2005使用xml参数创建临时表

时间:2015-06-02 16:03:32

标签: sql-server xml

我想从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?

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

然后插入的查询就像这样(避免使用像GROUPINSERT 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