【问题标题】:Return xml data from SQL query从 SQL 查询返回 xml 数据
【发布时间】:2020-02-06 09:09:18
【问题描述】:

我有一个 SQL 查询。

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

运行此查询时出现错误。

错误状态

Msg 9413, Level 16, State 1, Line 1
XML parsing: line 1, character 30, A string literal was expected

A.business_line 有 2 组值。

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

2) <collection><object parentid="ce57cc75-3966-478f-bf25-5e3abf716f96" parenttype="Object"><fields/></object></collection>

谁能帮我解决这个问题?

【问题讨论】:

  • 根据我的 cmets 关于您的其他问题,您必须检查 A.[business_line] 中的每个值,具体取决于您有多少行可以使用在线 XML 验证器手动执行此操作,或者您可能需要找到一些自动化的方法来执行此操作。不幸的是,没有人能在没有看到数据的情况下告诉你出了什么问题。
  • 如果您使用我的其他答案(即declare @Test...)中的手动测试代码来测试这两个,您会得到什么?
  • 如果我这样做,它会给我正确的价值。对于第一个数据,它提供 BL2,对于第二个数据,它提供'NULL' @DaleBurrell
  • 没错,所以您显示的数据与数据库中的实际数据不同。
  • Yes 也许.. 因为有超过 1000 行。

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


【解决方案1】:

请改用try_convert()。但如果你有 sql server 2012。

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

应用于您的原始查询。

select try_convert(xml, col).value('(/collection/object/fields/field/value)[1]', 'varchar(3)') 
from (
    select col= Coalesce(replace(replace(A.[business_line], char(10), ''''), char(13), ''''),'''') 
    from [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS] A) t1

【讨论】:

  • 需要最后的帮助。当我将其附加到查询中时。它向我显示语法错误。请参阅我的以下查询。
  • Declare @Query as nvarchar(1000) Set @Query='set nocount on;选择 Coalesce(replace(replace(A.[type], char(10), ''''), char(13), ''''),'''') 作为 Type, try_convert(xml, col)。 value('(/collection/object/fields/field/value)[1]', 'varchar(3)') from ( select col= Coalesce(replace(replace(A.[business_line], char(10), ' '''), char(13), ''''),'''') FROM [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS] A'
  • @metal 如果我在这里做错了,你能帮忙吗?
  • 我得到的错误是 ---- Msg 102, Level 15, State 1, Line 6 '/' 附近的语法不正确。
  • @NikhilKotian,请为此问题单独创建。
【解决方案2】:

XML 中有一行或多行包含错误字符。

运行此确认:

SELECT convert(xml, A.[business_line])
FROM [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS] A;

如果您仍然看到错误,您可以像这样使用TRY_CONVERTTRY_CAST 追踪错误行。

SELECT TRY_CONVERT(xml, A.[business_line])
FROM [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS] A
WHERE TRY_CONVERT(xml, A.[business_line]) IS NULL;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2018-05-21
    相关资源
    最近更新 更多