且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-11-27 21:34:26

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

Querying XML into a file needs to know a little bit about character encoding...

试试这个:

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

使用 -c 的第一个命令的结果现在即使使用 NVARCHAR

The result of the first command with -c will now destroy the russian letters even with NVARCHAR

<objects>
  <object>
    <TestString1>abc</TestString1>
    <TestString2>abc</TestString2>
  </object>
  <object>
    <TestString1>&lt;&amp;&gt; Russian: "???? ? ??????"</TestString1>
    <TestString2>&lt;&amp;&gt; Russian: "???? ? ??????"</TestString2>
  </object>
</objects>

带有 -w 的第二个命令的结果符合预期:

The result of the second command with -w is as expected:

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