【问题标题】:SQL - cast XML as nvarchar(max)SQL - 将 XML 转换为 nvarchar(max)
【发布时间】:2018-01-11 15:41:50
【问题描述】:

SQL stored procedure 有问题。 我需要从数据库中生成一个xml。 在我的存储过程中,我收集了所有信息,然后我的计划是根据需要生成 XML 文件(参见代码)。

我需要报告的所有交易都加载到变量@transactionXml 中。它的数据类型为xml,可以变得很大。

SET @xmlOut += '<export_datuma>' + cast(CAST(getdate() as date) as nvarchar(100)) + '</export_datuma>'
SET @xmlOut += '<export_szla_db>' + @noOfResults + '</export_szla_db>'
SET @xmlOut += '<kezdo_ido>' + cast(@fromDate as nvarchar(max)) + '</kezdo_ido>'
SET @xmlOut += '<zaro_ido>' + cast(@toDate as nvarchar(max)) + '</zaro_ido>'
SET @xmlOut += '<kezdo_szla_szam>' + @minInvoiceNo + '</kezdo_szla_szam>'
SET @xmlOut += '<zaro_szla_szam>' + @maxInvoiceNo + '</zaro_szla_szam>'
SET @xmlOut += cast(@transactionXml as nvarchar(max))
SET @xmlOut += '</szamlak>'

SELECT @xmlOut

当我尝试将数据类型转换为nvarchar(max)(如代码部分中所示)时,字符串不完整并且缺少一些信息。看起来,字符串在 x 符号之后被切断。

有没有办法将@transactionXml 变量完全转换为文本,以便我可以在@xmlOut 语句中使用它?

【问题讨论】:

  • 您如何验证字符串“不完整”?如果您要输出到 Management Studio,它只是截断字符串以进行演示。
  • 真的吗?这是我的提示,字符串(xml)不完整。
  • “如何”是指在哪里。如果在 Management Studio 中,这不是字符串的错,而是工具的错。我写过这个here
  • 有一个没有开始标签的结束&lt;/szamlak&gt;?您是错过了复制第一行还是真的错过了?
  • 您应该不要在字符串级别创建 XML!

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


【解决方案1】:

您不应该在字符串级别创建 XML!试试这个:

SELECT CAST(getdate() as date) AS export_datuma
      ,@noOfResults AS export_szla_db
      ,@fromDate AS kezdo_ido
      ,@toDate AS zaro_ido
      ,@minInvoiceNo AS kezdo_szla_szam
      ,@maxInvoiceNo AS zaro_szla_szam
      ,@transactionXml AS [*] --This is the pre-created XML which should be fine
FOR XML PATH('szamlak');

预先创建的 XML 必须没问题,否则无法将其存储为 XML 原生类型。

在字符串级别创建 XML 可能会产生各种危险的副作用。想象一下你的一个变量中有一个禁止字符......

【讨论】:

  • 这是一个非常好的解决方案。非常感谢!有没有办法在数据之前包含&lt;?xml version="1.0" encoding="UTF-8"?&gt;?`
  • @dns_nx Read this answer。简而言之:XML 的声明是 never SQL Server 中 native-type-XML 的一部分。它是关于文件编码的提示。 SQL-Server 的 XML 在任何情况下都被编码为UTF-16 / UCS-2。不同的声明将是错误的。您可以在CASTNVARCHAR(MAX) 之后添加任何字符串片段,但如果将其写入声明中,请务必将其存储为UTF-8 编码文件。许多人把这个声明当作一些花哨的额外...
  • 好的。感谢您的快速信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2020-12-26
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
相关资源
最近更新 更多