动态XML到存储过程插入

时间:2013-06-20 18:34:47

标签: sql-server xml stored-procedures

我有类似这样的xml:

<main>
    <kim id="child1_id" name="this is child1" active="1" />
    <kim id="Child2 id" name="this is child2" active="1" />
    <lee id="child3_id" heigt="189" weight="70" />
</main>

使用kim和lee是我数据库中表的名称。现在我必须创建一个存储过程来将上面的xml中的值插入到kim和lee中。我可以使用OPENXML获取表名,我知道我可以使用这样的查询来插入(例如)kim值:

declare @tempChild1 table(
   id      varchar(20),
   name    varchar(50),
   active  bit
)

select  C.value('@id', 'varchar(20)') as id,
        C.value('@name', 'varchar(50)') as name,
        C.value('@active', 'bit') as active,
from    @xml.nodes('/main/kim') t (C)

insert into child1
       select * 
       from @tempChild1 

问题是,它是一个动态的xml,我不知道哪些表会来自xml,但我仍然需要根据xml进行插入查询。有没有可能在SQL中做到这一点?我可以从上面的xml中做出如下所示的声明吗?

exec spx_kim @xml
exec spx_lee @xml
带有@xml的

是xml中每个kim和lee节点的值。

我非常感谢你给我的每一个帮助。

2 个答案:

答案 0 :(得分:1)

试试这个 -

<强> DDL:

CREATE PROCEDURE dbo.usp_kim
(
     @XML XML
)
AS BEGIN

     SET NOCOUNT ON;

     --INSERT INTO ....
     SELECT  
            t.c.value('@id', 'VARCHAR(20)')
          , t.c.value('@name', 'VARCHAR(50)')
          , t.c.value('@active', 'BIT')
     FROM @XML.nodes('/main/kim') t(c)


END
GO

CREATE PROCEDURE dbo.usp_lee
(
     @XML XML
)
AS BEGIN

     --INSERT INTO ....
     SELECT  
            t.c.value('@id', 'VARCHAR(20)')
          , t.c.value('@heigt', 'INT')
          , t.c.value('@weight', 'INT')
     FROM @XML.nodes('/main/lee') t(c)

END
GO

<强>查询:

DECLARE @XML XML
SELECT @XML = '
<main>
    <kim id="child1_id" name="this is child1" active="1" />
    <kim id="Child2 id" name="this is child2" active="1" />
    <lee id="child3_id" heigt="189" weight="70" />
</main>'

EXEC dbo.usp_kim @XML = @XML
EXEC dbo.usp_lee @XML = @XML

答案 1 :(得分:0)

毕竟,我必须手动为每个涉及的表创建存储过程