所以我很难弄清楚如何实现这一点这样我就可以附加xml编码回答我的问题。
到目前为止,这就是我所破解的:
DECLARE @FileName VARCHAR(50)
DECLARE @SQLCmd VARCHAR(8000)
SELECT @FileName = 'C:SampleXMLOutput.xml'
-- in this command, we are making sure there is only one ROOT node
SELECT @SQLCmd = + 'bcp ' +
'"SELECT Id, Initials, firstname, lastname, email ' +
' FROM Employees.dbo.IDCards ' +
' FOR XML PATH(''Employee''), ELEMENTS, ROOT(''Employees''), TYPE "' +
' queryout ' +
@FileName +
' -w -T -S' + @@SERVERNAME
-- display command, for visual check
SELECT @SQLCmd AS 'Command to execute'
-- create the XML file
EXECUTE master..xp_cmdshell @SQLCmd
此外,我还需要从同一查询输出中的另一个表中获取一些数据。
感谢的任何帮助
由于语法原因,我认为您正在使用SQL Server。。。
有了FOR XML PATH
,就可以创建一个类似于的processing instruction
SELECT 'test' AS OneNormalElement
,'version="1.0" encoding="UTF-8"' AS [processing-instruction(abc)]
FOR XML PATH('Test')
结果
<Test>
<OneNormalElement>test</OneNormalElement>
<?abc version="1.0" encoding="UTF-8"?>
</Test>
但是您不允许使用AS [processing-instruction(xml)]
。你会得到错误:
错误:6879,严重性:16,"xml"是无效的xml处理指令目标。可能尝试构造XML声明使用XML处理指令构造函数。XML声明不支持使用FOR XML构造。
实际上不支持在XML的之外创建任何PI。。。
我链接为"重复"的问题显示了一些变通方法,如何无论如何添加它。。。
更新
我必须为迟来的答复和错误的暗示道歉。xml声明的处理方式不同,因此链接的答案实际上没有帮助。我也更新了这个。。。
我发现添加XML声明的唯一方法是string concatenation
:
DECLARE @ExistingXML XML=
(
SELECT
'Test' AS Test,
'SomeMore' AS SomeMore
FOR XML PATH('TestPath'),TYPE
);
DECLARE @XmlWithDeclaration NVARCHAR(MAX)=
(
SELECT '<?xml version="1.0" encoding="UTF-8"?>'
+
CAST(@ExistingXml AS NVARCHAR(MAX))
);
SELECT @XmlWithDeclaration;
如果你想在一次通话中完成,你必须在没有,TPYE
的情况下完成
DECLARE @XmlWithDeclaration NVARCHAR(MAX)=
(
SELECT '<?xml version="1.0" encoding="UTF-8"?>'
+
(
SELECT
'Test' AS Test,
'SomeMore' AS SomeMore
FOR XML PATH('TestPath')
)
);
SELECT @XmlWithDeclaration;
所以——最后——我希望这是你的解决方案:
编辑:双引号。请参阅评论
SELECT @SQLCmd = + 'bcp ' +
'"SELECT ''<?xml version=""1.0"" encoding=""UTF-8""?>'' + ' +
' (SELECT Id, Initials, firstname, lastname, email ' +
' FROM Employees.dbo.IDCards ' +
' FOR XML PATH(''Employee''), ELEMENTS, ROOT(''Employees'')) "' +
' queryout ' +
@FileName +
' -w -T -S' + @@SERVERNAME