SQL 追加 <?xml 版本= "1.0"编码= "UTF-8" ?> 到查询输出



所以我很难弄清楚如何实现这一点这样我就可以附加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

最新更新