能否将SQL Server 2012数据导出到XML文件中

能否将SQL Server 2012数据导出到XML文件中,xml,sql-server-2012,export-to-xml,Xml,Sql Server 2012,Export To Xml,下面是一个非常小的SQL和XML示例,但不知道如何将其导出到C:\Users\Simon.Evans\Documents\Test.XML中。公平地说,我对XML几乎一无所知,所以只能在黑暗中行走。最后,我试图找到一种将SQL表导出到XML文件的方法 SELECT patient.OID AS '@ID', patient.FORENAME, patient.SURNAME, patient.TITLECODE, patient.BIRTHDTTM FROM

下面是一个非常小的SQL和XML示例,但不知道如何将其导出到C:\Users\Simon.Evans\Documents\Test.XML中。公平地说,我对XML几乎一无所知,所以只能在黑暗中行走。最后,我试图找到一种将SQL表导出到XML文件的方法

SELECT 
    patient.OID AS '@ID',
    patient.FORENAME, patient.SURNAME,
    patient.TITLECODE,
    patient.BIRTHDTTM
FROM 
    HealthBI.dbo.LZO_PATIENT patient
WHERE patient.OID = '3400000000'
FOR XML PATH('Patient'), ROOT('Patient')
sql的XML输出为:

<Patient>
  <Patient ID="3400000000">
    <FORENAME>IDA</FORENAME>
    <SURNAME>CARR</SURNAME>
    <TITLECODE>CC_MRS</TITLECODE>
    <BIRTHDTTM>1929-10-25T00:00:00</BIRTHDTTM>
  </Patient>
</Patient>

艾达
卡尔
抄送夫人
1929-10-25T00:00:00

所以@dSQL将是您的SQL语句 @LocalPath&@Filename将是路径和文件名(记住在服务器上)

您可以在#+bcpOutput表中看到BCP命令的结果

  Select @CreateXmlFileCommand = 'bcp "' + @dSQL + '" queryout ' + @LocalPath + @FileName + ' -c -r -t -T -' + @@SERVERNAME;
  select @CreateXmlFileCommand

  CREATE TABLE #_bcpOutput ([Output] VARCHAR(250));         
  INSERT Into #_bcpOutput ([Output]) EXEC master..xp_cmdshell @CreateXmlFileCommand;

将XML查询到文件中需要了解一点字符编码

试试这个:

USE master;
GO
CREATE DATABASE TestDB;
GO

CREATE TABLE TestDB.dbo.TestTbl(TestString1 VARCHAR(100),TestString2 NVARCHAR(100));
INSERT INTO TestDB.dbo.TestTbl VALUES('abc',  N'abc')
                                    ,('<&> Russian: "слов в тексте"', N'<&> Russian: "слов в тексте"');
GO                           
SELECT * FROM TestDB.dbo.TestTbl FOR XML PATH('Test'),ROOT('String');

/* The result of the simple SELECT shows, that VARCHAR cannot deal with russian letters
<String>
  <Test>
    <TestString1>abc</TestString1>
    <TestString2>abc</TestString2>
  </Test>
  <Test>
    <TestString1>&lt;&amp;&gt; Russian: "???? ? ??????"</TestString1>
    <TestString2>&lt;&amp;&gt; Russian: "слов в тексте"</TestString2>
  </Test>
</String>
*/
GO

--Two times the same command, only difference is -w instead of -c:  
--And: YOU HAVE TO FULLY QUALIFY THE OBJECT's NAME!                  
DECLARE @cmd1 VARCHAR(4000)='bcp "SELECT * FROM TestDB.dbo.TestTbl FOR XML PATH(''object''),ROOT(''objects'');" queryout "c:\dvp\test1.xml" -T -c -S' + @@SERVERNAME;
DECLARE @cmd2 VARCHAR(4000)='bcp "SELECT * FROM TestDB.dbo.TestTbl FOR XML PATH(''object''),ROOT(''objects'');" queryout "c:\dvp\test2.xml" -T -w -S' + @@SERVERNAME;

EXECUTE master..xp_cmdshell @cmd1;
EXECUTE master..xp_cmdshell @cmd2;
GO
DROP DATABASE TestDb;
GO
带有
-w
的第二个命令的结果与预期一致:

<objects>
  <object>
    <TestString1>abc</TestString1>
    <TestString2>abc</TestString2>
  </object>
  <object>
    <TestString1>&lt;&amp;&gt; Russian: "???? ? ??????"</TestString1>
    <TestString2>&lt;&amp;&gt; Russian: "слов в тексте"</TestString2>
  </object>
</objects>

abc
abc
&;俄语:“???????”
&;俄文:“бббббббббб”

应该注意的是,如果要从T-SQL脚本使用
xp\u cmdshell
过程,则需要明确激活该过程。请参阅您提供的开关不是最佳的。你可以看看我的答案,为什么至少
-w
而不是
-c
很重要
<objects>
  <object>
    <TestString1>abc</TestString1>
    <TestString2>abc</TestString2>
  </object>
  <object>
    <TestString1>&lt;&amp;&gt; Russian: "???? ? ??????"</TestString1>
    <TestString2>&lt;&amp;&gt; Russian: "слов в тексте"</TestString2>
  </object>
</objects>