【问题标题】:Use SQL to Evaluate XML string broken into several rows使用 SQL 评估分成几行的 XML 字符串
【发布时间】:2020-04-15 00:38:01
【问题描述】:

我有一个应用程序将单个 XML 记录存储为 3 个单独的行,我假设由于长度限制。前两行每行最多存储 4000 个字符,不幸的是,每条记录都没有在同一个地方中断。

我正在尝试找到一种方法将三行组合成一个完整的 XML 记录,然后我可以从中提取数据。

我已尝试连接这些行,但找不到数据类型或其他任何可以让我将三行拉入单个可读 XML 记录的数据类型。

我遇到了一些限制,因为我们只能选择访问数据库,而我只能使用 SQL,因为我没有足够的访问权限来实现任何类型的外部程序来提取数据有一个用别的东西来操纵它。

任何想法将不胜感激。

【问题讨论】:

  • 你能提供你的数据和一个可重复的例子吗?这将有助于其他人回答您的问题。

标签: tsql sql-server-2014


【解决方案1】:

没有样本数据和预期结果,我们只能提供一种可能的方法。

由于您是 2017 年,您可以访问string_agg()

这里我使用 ID 作为正确的顺序。

我应该补充一点,如果转换为 XML 失败,try_convert() 将返回 NULL。

示例

Declare @YourTable table (ID int,SomeCol varchar(4000))
Insert Into @YourTable values
 (1,'<root><name>XYZ Co')
,(2,'mpany</')
,(3,'name></root>')

Select try_convert(xml,string_agg(SomeCol,'') within group (order by ID) )
 From  @YourTable

退货

<root>
  <name>XYZ Company</name>
</root>

编辑 2014 选项

Select try_convert(xml,(Select '' + SomeCol
                         From  @YourTable 
                         Order By ID
                         For XML Path(''), TYPE).value('.', 'varchar(max)')
        )

甚至

Declare @S varchar(max) = ''

Select @S=@S+SomeCol
 From  @YourTable
 Order By ID

Select try_convert(xml,@S)

【讨论】:

  • 谢谢,约翰。不幸的是,我对后端运行的 SQL Server 版本有误。我正在运行 SSMS 2017,但连接到 SQL Server 2014 数据库。我已经更新了标签以正确反映这一点。非常感谢您的意见。
  • 我还应该提一下,我确实尝试了这个解决方案,并且在得到'STRING_AGG'的结果不是一个公认的内置函数名时才意识到后端不是2017。再次感谢。
  • @LouisNegron 参见 EDIT 2014 选项(提供了两种选择)
  • @LouisNegron 如果您编辑您的问题并提供一个小数据样本,也许会有所帮助
  • 谢谢,约翰。我确实让你的样品工作了。这是我自己的错,因为我试图用一个选择填充插入,但我在括号中选择了我的选择。 2014 年的第一个示例确实为我提供了一个完整的 XML 字符串,因此非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多