2011-08-23 86 views
2

我想寫一個存儲過程,其中我從XML字符串中插入了一些東西。 這是爲了避免在循環中進行大量的存儲過程調用。需要幫助解析XML字符串並在存儲過程中插入值

這是我走到這一步,但它給我的錯誤:

消息207,級別16,狀態1,過程newsMapper_prc,第22行
無效的列名 '標題'。
消息207,級別16,狀態1,過程newsMapper_prc,行22
無效的列名'故事'。
消息207,級別16,狀態1,過程newsMapper_prc,行25
無效的列名'實體'。
消息207,級別16,狀態1,過程newsMapper_prc,行27
無效的列名稱'實體'。

真的不能想出解決辦法,一些幫助,將不勝感激

<newsfile> 
    <headline>THIS IS A NEWS HEADLINE</headline> 
    <story>THIS IS A NEWS STORY</story> 
    <entity> 1234</entity> 
    <entity>1111</entity> 
    <entity>2222</entity> 
</newsfile> 

存儲過程的代碼:

CREATE PROCEDURE newsMapper_prc 
-- Add the parameters for the stored procedure here 
    (@xmlString xml) 
AS 
declare @criteriaTable table (criterianame varchar(100), parm varchar(MAX)) 

insert into @criteriaTable 
Select 
    criteriaValues.parm.value('../@type','varchar(MAX)'), 
    criteriaValues.parm.value('.','varchar(MAX)') 
from @xmlString.nodes('/newsfile/headline') as headline(parm), 
@xmlString.nodes('/newsfile/headline/story') as story(parm), 
@xmlString.nodes('/newsfile/headline/story/entity') as entity(parm) 

insert into News (newsHeadline, newsStory, newsDate) values ((select headline from   @criteriaTable),(select story from @criteriaTable), GETDATE()) 
declare @newsID int 
SET @newsID = scope_identity() 
while exists (select entity from @criteriaTable) 
BEGIN 
insert into NewsEntities(newsID,entityID) values (@newsID,(Select entity from @criteriaTable)) 
END 
+1

我想這意味着是SQL Server的?哪個版本? –

回答

3

考慮使用這個你的XML

DECLARE @input XML 
SET @input = '<newsfile> 
    <headline>THIS IS A NEWS HEADLINE</headline> 
    <story>THIS IS A NEWS STORY</story> 
    <entity> 1234</entity> 
    <entity>1111</entity> 
    <entity>2222</entity> 
</newsfile>' 

T-SQL語句,你可以「撕開」你的XML int Ø行和列:

SELECT 
    NF.Ent.value('(.)[1]', 'int') AS 'Entity', 
    @input.value('(/newsfile/headline)[1]', 'varchar(100)') AS 'Headline', 
    @input.value('(/newsfile/story)[1]', 'varchar(100)') AS 'Story' 
FROM 
    @input.nodes('/newsfile/entity') AS NF(Ent) 

這給你:

Entity Headline     Story 
1234 THIS IS A NEWS HEADLINE THIS IS A NEWS STORY 
1111 THIS IS A NEWS HEADLINE THIS IS A NEWS STORY 
2222 THIS IS A NEWS HEADLINE THIS IS A NEWS STORY 

現在你怎麼想這個信息辦??我不是很瞭解你的存儲過程是試圖做.....

如果我理解正確的 - 你要插入的標題和故事到News表,並獲得IDENTITY ID後面:

INSERT INTO dbo.News(newsHeadline, newsStory, newsDate) 
    SELECT 
     @input.value('(/newsfile/headline)[1]', 'varchar(100)') AS 'Headline', 
     @input.value('(/newsfile/story)[1]', 'varchar(100)') AS 'Story', 
     GETDATE() 

DECLARE @NewsID INT 
SET @NewsID = SCOPE_IDENTITY() 

然後你想在你的XML中爲每個<entity>的值在NewsEntities表中添加一個條目 - 正確嗎?

INSERT INTO dbo.NewsEntities(NewsID, EntityID) 
    SELECT 
     @NewsID, 
     NF.Ent.value('(.)[1]', 'int') 
FROM 
    @input.nodes('/newsfile/entity') AS NF(Ent) 

如果你把所有這些組合起來 - 這是否解決您的問題=

+0

是的,這看起來不錯,即時測試 – tap

+0

nvm我編輯的東西時,我有一個錯誤,工作表示感謝 – tap

+1

+1解釋SP的好工作。 –