SQL - 将XML转换为nvarchar(max)

时间:2018-01-11 15:41:51

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

我遇到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语句中使用它?

1 个答案:

答案 0 :(得分:3)

您不应该在字符串级别创建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可能会产生各种危险的副作用。想象一下你的一个变量中的一个禁止的角色......