pasar - Puede exportar datos de SQL Server 2012 a un archivo XML
pasar un archivo xml a tabla sql (2)
A continuación se muestra un pequeño ejemplo de SQL y XML, pero no hay idea de cómo exportar esto en decir C: / Users / Simon.Evans / Documents / Test.xml. Para ser justos, tengo muy poco o ningún conocimiento de XML, así que caminar en la oscuridad. En definitiva, estoy tratando de encontrar una forma de exportar tablas SQL en un archivo 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'')
y la salida XML del sql es:
<Patient>
<Patient ID="3400000000">
<FORENAME>IDA</FORENAME>
<SURNAME>CARR</SURNAME>
<TITLECODE>CC_MRS</TITLECODE>
<BIRTHDTTM>1929-10-25T00:00:00</BIRTHDTTM>
</Patient>
</Patient>
Así que @dSQL sería tu SQL Statment @LocalPath & @Filename sería la ruta y el nombre del archivo (recuerda en el servidor).
Puede ver los resultados del comando BCP en la tabla # + bcpOutput.
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;
La consulta de XML en un archivo necesita saber un poco sobre la codificación de caracteres ...
Prueba esto:
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><&> Russian: "???? ? ??????"</TestString1>
<TestString2><&> 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
El resultado del primer comando con -c
ahora destruirá las letras rusas incluso con NVARCHAR
<objects>
<object>
<TestString1>abc</TestString1>
<TestString2>abc</TestString2>
</object>
<object>
<TestString1><&> Russian: "???? ? ??????"</TestString1>
<TestString2><&> Russian: "???? ? ??????"</TestString2>
</object>
</objects>
El resultado del segundo comando con -w
es el esperado:
<objects>
<object>
<TestString1>abc</TestString1>
<TestString2>abc</TestString2>
</object>
<object>
<TestString1><&> Russian: "???? ? ??????"</TestString1>
<TestString2><&> Russian: "слов в тексте"</TestString2>
</object>
</objects>