4

我有类似这样的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>

with kim and 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 节点的值。

我真的很感谢你给我的每一个帮助。

4

2 回答 2

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
于 2013-06-21T05:39:39.253 回答
0

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

于 2013-07-05T15:02:03.120 回答