tap
tap

Reputation: 553

Need help parsing an XML string and inserting values in stored procedure

I'm trying to write a stored procedure in which I insert a few things from an XML string. This is to avoid making lots of stored procedure calls from inside a loop.

This is what I got so far, but its giving me errors:

Msg 207, Level 16, State 1, Procedure newsMapper_prc, Line 22
Invalid column name 'headline'.
Msg 207, Level 16, State 1, Procedure newsMapper_prc, Line 22
Invalid column name 'story'.
Msg 207, Level 16, State 1, Procedure newsMapper_prc, Line 25
Invalid column name 'entity'.
Msg 207, Level 16, State 1, Procedure newsMapper_prc, Line 27
Invalid column name 'entity'.

Can't really figure this out, some help would be greatly appreciated

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

Stored procedure code:

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

Upvotes: 2

Views: 1407

Answers (1)

marc_s
marc_s

Reputation: 754488

Given your 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>'

using this T-SQL statement, you can "rip apart" your XML into rows and columns:

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)

this gives you:

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

Now what do you want to do with this information?? I can't quite understand what your stored proc is trying to do.....

If I understand correctly - you want to insert the headline and the story into the News table and get the IDENTITY ID back:

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()

and then you want to add an entry into the NewsEntities table for each value of <entity> in your XML - correct?

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

If you put this all together - does that solve your problem?=

Upvotes: 3

Related Questions