【发布时间】: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