【问题标题】:Query value from XML data element从 XML 数据元素查询值
【发布时间】:2019-10-09 03:14:44
【问题描述】:

我有一个从列返回数据的 SQL 查询。但是,列中的数据是 XML 格式的。我需要值元素内的值。我该怎么做?

请看我下面的 SQL 查询。

SELECT 
    A.[business_line]
FROM
    [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS] A
INNER JOIN
    [EU_OTH_REG].[dbo].[TBL_EU_OTH_REG_MST_LOOKUP] B ON B.code = A.product_substance_type

这个查询的输出是

<collection><object parentid="ce57cc75-3966-478f-bf25-5e3abf716f96" parenttype="Object"><fields><field name="code"><value>BL2</value></field></fields></object></collection>

我想要这个值BL2。数据位于value 元素内。任何人都可以帮助如何做到这一点?我尝试使用东西,但无法获得价值。

【问题讨论】:

    标签: sql sql-server xml tsql sql-server-2012


    【解决方案1】:

    XML.value() 的作用如下:

    declare @Test xml = '<collection><object parentid="ce57cc75-3966-478f-bf25-5e3abf716f96" parenttype="Object"><fields><field name="code"><value>BL2</value></field></fields></object></collection>';
    
    select @Test.value('(/collection/object/fields/field/value)[1]', 'varchar(3)' )
    

    返回:

    BL2
    

    所以将它添加到您的查询中:

    select A.[business_line].value('(/collection/object/fields/field/value)[1]', 'varchar(3)'
    from [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS] A
    inner join [EU_OTH_REG].[dbo].[TBL_EU_OTH_REG_MST_LOOKUP] B
        on B.code = A.product_substance_type
    

    正如您所指出的 A.[business_line] 不是 XML 数据类型,只需在调用 value 之前对其进行转换:

    convert(xml, A.[business_line]).value
    

    注意:我假设它只有一个 3 个字符的结果,即varchar(3),但如果不调整以适应。

    【讨论】:

    • 它给出错误。不能在 nvarchar(max) 上调用方法。我需要将其转换或转换为 xml 吗? @代尔
    • 嗯,是的,理想情况下,您会将 XML 存储在 XML 数据类型中,但如果不是,则只需转换/转换它。
    • 你能帮忙吗?
    • 我运行这个查询。 select convert(xml, A.[business_line]).value('(/collection/object/fields/field/value)[1]', 'varchar(3)') from [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS ] A 内连接 [EU_OTH_REG].[dbo].[TBL_EU_OTH_REG_MST_LOOKUP] B on B.code = A.product_substance_type
    • 我现在收到一个新错误。消息 9413,级别 16,状态 1,第 1 行 XML 解析:第 1 行,字符 30,应为字符串文字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多