【问题标题】:Dynamic XML to Stored Procedure Insert动态 XML 到存储过程插入
【发布时间】:2013-06-20 18:34:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server xml stored-procedures


    【解决方案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
    

    【讨论】:

    • 我之前已经尝试过,但是我不知道xml会来自哪个表。假设如果有更多的表来自不同的表,即 ais (表名),我应该为 ais 表创建另一个 sp 吗?感谢您的帮助:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      相关资源
      最近更新 更多