SQL追加<! - ?xml version =“1.0”encoding =“UTF-8”? - >查询输出

时间:2016-05-25 13:47:36

标签: sql-server xml encoding 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

此外,我需要从同一查询输出中的另一个表中获取一些数据。

任何帮助表示赞赏

1 个答案:

答案 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