【问题标题】:How to prevent sqlcmd truncation with for xml path query result如何使用 xml 路径查询结果防止 sqlcmd 截断
【发布时间】:2014-06-21 19:55:49
【问题描述】:

阅读one answersecond answerinfopage on sqlcmd 后,我仍然无法让以下工作。

我正在尝试使用批处理文件中的 sqlcmd 将结果查询到 xml 文件中。

批处理文件如下所示:

sqlcmd -R -d DBName -i "c:\inputquery.sql" -h-1 -y 0 -o "c:\outputfile.xml"

简单的sql查询是:

:XML ON
SELECT '<?xml version="1.0" encoding="UTF-8"?>' +
CAST((
SELECT Columns FROM Table
FOR XML PATH ('Product'), ROOT('Products')
) 
AS NVARCHAR(MAX))

输出是一个大约 1025Kb 的 xml 文件,其中包含一个截断的字符串。我认为它会截断为 1mb,但你怎么能防止这种情况呢?目标是将完整的查询结果放入 xml 文件中。据我所知,所有选项都已使用。顺便使用TSQL SSMS2008。

【问题讨论】:

  • 如果您只是在 SSMS 中工作,那么可以选择控制可以返回多少 XML 数据。 1MB、2MB、5MB 或无限。见工具 |选项 |查询结果 | SQL 服务器 |结果到网格 | XML 数据。它没有“Results to File”选项。但也许您可以将查询运行到 Grid,然后保存结果?
  • 如果你只使用 SSMS 那就可以了,但是我需要使用批处理文件来自动化这个过程。 SSMS 设置对 sqlcmd 结果没有影响。还是谢谢!
  • 我用 BCP 来做这样的事情。这是一个 BCP 示例:stackoverflow.com/a/2586615/822072
  • 是的,这也是一种可能,我尝试了 BCP,但没有成功,但刚刚发现 xp_cmdshell 没有激活,如果我修复它,看看它会做什么。我也会尝试使用 SSIS 包。 excel-sql-server.com/…
  • 在用尽 sqlcmd.exe 和 SSMS 的所有可见选项后,我编写了一个 Java 程序来提取我需要的 XML 列。几乎不是一个通用的解决方案,但它完成了这项工作。

标签: xml sql-server-2008 tsql batch-file for-xml-path


【解决方案1】:

我今天遇到了同样的问题,我使用了 -y0 选项。我的输出现在看起来正确。我想我会发布我的发现,这样它可能会帮助其他人遇到同样的事情。

sqlcmd -Sxxxxxxx -E -dmaster -h-1 -y0 -Q" my query that produces long results in here;" > "D\:out.txt"

-h-1 也会删除列标题。

【讨论】:

  • -y0 的最大值为 1 兆字节。 (我遇到了与 OP 相同的问题,即 1048676 个字符是不够的。)
  • 当我尝试使用 -h-1-y0 时,我收到此错误消息:Sqlcmd: The -h and the -y 0 options are mutually exclusive.。虽然看起来即使没有-h-1,标题仍然被排除在外。
【解决方案2】:

您需要将您的 XML 输出为 XML 类型。通常,除了FOR XML 之外,还使用TYPE 指令来完成。但是,如果您想添加 Xml 声明,则必须将所有内容放入一个 xml 变量中,然后选择它。例如:

declare @xml as xml
select @xml = cast(('<?xml version="1.0" encoding="UTF-16"?>'+cast((SELECT Columns FROM Table FOR XML PATH ('Product'), ROOT('Products')) as nvarchar(max))) as xml)

select @xml

编辑:抱歉。添加 Xml 声明将不起作用,因为 Sql 以其本机编码 (UTF-16) 将流显示为 XML,并且它将剥离任何声明。

编辑

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多