【问题标题】:What is the best way to get a XML as output from a SQL Server procedure in Delphi?从 Delphi 中的 SQL Server 过程中获取 XML 作为输出的最佳方法是什么?
【发布时间】:2018-08-29 17:02:17
【问题描述】:

我需要在 Delphi 中读取 SQL Server 过程的输出,该过程返回 XML 作为输出 (@MSG1)

PROCEDURE dbo.PROC_ZUND_XML
    (@LOTEPC VARCHAR(10), 
     @MSG1 NVARCHAR(MAX) OUTPUT) 

我尝试使用TFDStoredProc 组件和TFDQuery 来获得此输出,但是,我在Delphi 的参数配置中使用的变量类型并不重要(ftWideString、@987654327 @ 等)它总是只存储输出的前 8000 个字符。 Delphi 的 FireDAC 查询编辑器的 SQL 命令部分中的计数语句显示该过程的输出有超过 8000 个字符。

所以,当值被分配给变量时,问题似乎是在内部发生的。有人知道如何解决它吗?也许是解决问题的不同方法...在此先感谢。

我使用的是 SQL Server 2008 和 Delphi 10.2

【问题讨论】:

  • 我可以在 SQL Server 2014 上复制相同的内容。该过程似乎以某种方式修剪数据。在您为其赋值以查看其数据长度后,尝试检查您的 MSG1 参数的 DATALENGTH。 FireDAC 然后从 ODBC 接收相同的数据长度值。
  • 你是如何给@MSG1赋值的?
  • 问题肯定出在 SQL Server 端。在正文中插入例如SELECT @MSG1 = CAST('' AS NVARCHAR(4001)); 会导致错误“给转换规范'nvarchar' 的大小(4001)超过了任何数据类型(4000)所允许的最大值。” 执行过程时创建脚本。
  • 执行以下代码:DECLARE @TEST NVARCHAR(MAX); EXEC PROC_ZUND_XML 23494, @TEST OUTPUT SELECT LEN (@TEST) 返回8007。我将值分配给变量的方式是SET @MSG1 = (SELECT DRIVER AS "Driver", '0' AS "TransactionId", PART_CODE AS "PartCode", [...] FROM [#LOTE_ITENS_ZUND] FOR XML PATH('QueuedItem'),ROOT('RPOrderGenerator')) 所以,问题似乎不在 SQL Server 端。有什么建议吗?

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


【解决方案1】:

如果您需要将此 xml 文件导出到特定文件夹,我建议您使用 SQL SERVER 本身将此文件导出到共享网络文件夹。

使用 BCP,您可以生成 XML,并直接保存到 XML 文件中,在您想要的目录中..

一些有用的提示:     

  • 如有必要,我建议使用 -w 参数以避免混淆 字符错误(À、É、È、Ó、Ò)

有用的文档: http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=171529 https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2012/ms162802(v=sql.110) https://sqlsouth.wordpress.com/2014/05/23/export-xml-from-sql-server-using-bcp/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2010-10-16
    • 2010-11-25
    • 2015-04-24
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多