2013-06-20 63 views
4

我有類似這樣的XML:動態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> 

與金正日和李是在我的數據庫表的名稱。現在我必須做一個存儲過程,將上述xml中的值插入kim和lee。我可以用OPENXML得到表的名字,我知道,我可以用這樣的查詢,用於插入(例如)金值:

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節點的值。

我真的很感謝你給我的每一個幫助。

回答

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 
+0

我已經嘗試之前,但再一次,我不知道什麼表將來自XML。比方說,如果有更多的表來自不同的表,即ais(表名),我應該爲ais表創建另一個表?謝謝你的幫助 :) –