【问题标题】:Need help parsing an XML string and inserting values in stored procedure需要帮助解析 XML 字符串并在存储过程中插入值
【发布时间】:2011-08-23 18:56:29
【问题描述】:

我正在尝试编写一个存储过程,在其中我从 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

【问题讨论】:

  • 我想这应该是 SQL Server 吧?哪个版本?

标签: sql sql-server xml stored-procedures


【解决方案1】:

给定你的 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“拆分”为行和列:

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 中 &lt;entity&gt; 的每个值在 NewsEntities 表中添加一个条目 - 对吗?

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

如果你把这一切放在一起 - 这能解决你的问题吗?=

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多