【问题标题】:Passing multiple xml to stored procedure and retrieving xml attribute将多个 xml 传递给存储过程并检索 xml 属性
【发布时间】:2014-03-31 06:46:57
【问题描述】:

我有一个存储过程,它读取一些 Id 并从表中获取与这些 id 关联的 XML 的值。

USE [Database]
GO
/****** Object:  StoredProcedure [dbo].[GetLetterIssueTcm]    Script Date: 03/31/2014 12:07:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

Create PROCEDURE [dbo].[GetLetterIssueTcm]

@LetterIds varchar(5000)

AS 

Declare @SQL VarChar(1000)

select @SQL = 'Select content from component_presentations where publication_id =  80
and template_id = 41064 and component_id in (' + @LetterIds +')'    

Exec ( @SQL)

LetterIds 是一个逗号分隔的 id 字符串,例如“55773,52663” 此存储过程返回的内容包含每个 LetterId 的 XML。 XML 看起来像:

<letterIssue>
    <Date>2010-12-01T00:00:00</Date>
    <Items>
        <Item id="tcm:80-74757"></Item>
        <Item id="tcm:80-74760"></Item>
        <Item id="tcm:80-74766"></Item>
        <Item id="tcm:80-74770"></Item>
        <Item id="tcm:80-74772"></Item>
    </Items>
</letterIssue> 

现在我想创建一个虚拟表,其中一列中包含字母 ID,第二行中包含该字母 ID 的 xml 中的关联项目 ID。比如:

LetterId           Item_Id
55773             tcm:80-74757
55773             tcm:80-74760

这可以在同一个存储过程中完成,或者我不介意将此存储过程的输出(多个 xml)传递给另一个,然后检索与其关联的项目 ID。那么如何处理多个xml并从中找到项目ID呢?

【问题讨论】:

    标签: mysql sql sql-server xml stored-procedures


    【解决方案1】:

    这样的?

    select component_id, i.i.value('@id', 'varchar(100)') as item
    from component_presentations t
    outer apply t.content.nodes('/letterIssue[1]/Items[1]/Item')i(i)
    where publication_id =  80 and template_id = 41064 and
        component_id in (55773,66884)
    

    附:如果有一天你会收到@LetterIds = '55773;drop table component_presentations',你会怎么做?

    【讨论】:

    • 你能帮我理解一下吗?我无法理解你所做的任何事情。 sql新手。
    • 外部应用每条记录的倍数,按找到的Item 元素的数量。所以你会得到许多看起来像这样的小 xml:&lt;Item id="tcm:80-74757"&gt;&lt;/Item&gt;。然后说 value 你从这些小 xml 中获取数据。
    • 出现错误:消息 9506,级别 16,状态 1,过程 GetPublicationAndNewsLetterIssueTcm,第 10 行 XMLDT 方法“节点”只能在 xml 类型的列上调用。
    • 可能content列的数据类型不是xml?如果您不想或无法更改content 列的数据类型,请将t.content.nodes 替换为t.cast(content as xml).nodes
    • .../Item')i(i)。首先i 是我们拥有的节点的别名。第二个是这些节点中的列名。
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多