2017-04-11 70 views
1

下面是SQL和XML的一个非常小的示例,但不知道如何将它导出为C:\ Users \ Simon.Evans \ Documents \ Test.xml。为了公平起见,我几乎没有将XML的知识归零,所以走在黑暗中。最终,我试图找到一种将SQL表导出为XML文件的方法。您可以将SQL Server 2012数据导出到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> 

回答

1

所以@dSQL将是你的SQL Statment @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; 
+1

应该指出的是,'xp_cmdshell'程序需要被明确地激活,如果你想从一个T-SQL脚本中使用它。请参阅http://stackoverflow.com/q/5131491/243373 –

+1

您提供的交换机不是最佳的。你可能会看看我的答案,为什么至少'-w'而不是'-c'是重要的 – Shnugo

+0

欢呼声 - 下次我注意到需要使用这个 – AntDC

1

查询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 

第一个命令与-c结果将现在破坏俄罗斯字母即使有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结果:

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