如何使用for xml路径查询结果阻止sqlcmd截断

时间:2014-06-21 19:55:49

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

在阅读one answersecond answer以及infopage 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。

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:-1)

您需要将XML输出为XML类型。通常,除了TYPE之外,还使用FOR XML指令完成。但是如果要添加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,并且它将剥离任何声明。

修改