所以我在弄清楚如何使这项工作变得有点麻烦 这样我就可以追加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
此外,我需要从同一查询输出中的另一个表中获取一些数据。
任何帮助表示赞赏
答案 0 :(得分:1)
我假设 - 由于语法 - 您使用的是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 之外创建
。我将链接为“重复”的问题显示了一些解决方法,无论如何都要添加...
我必须为迟到的回应以及错误的提示道歉。 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