提问人:Ankit Kumar 提问时间:10/12/2023 最后编辑:marc_sAnkit Kumar 更新时间:11/1/2023 访问量:73
根据 XML 架构文件将 SQL Server 数据导出到 XML
Export SQL Server data to XML as per XML schema file
问:
我有一个包含多个元素和属性的(XML 架构文件),并且我有一个包含该文件中所有列的 SQL Server 表。如何将数据从SQL Server表导出到与文件具有相同格式(与xsd文件具有相同元素和属性层次结构)的XML文件?.XSD
.XSD
.XSD
例如,如果我在 Visual Studio 中加载 xsd 文件,那么它会从该元素生成一个示例 XML 文件。我希望 SQL Server 表中的数据与示例 XML 文件的方式相同。Root
我尝试使用SSIS中的脚本任务将SQL数据写入XML,但这会生成一个包含默认表架构和数据的XML文件。我只想要架构格式的 SQL Server 数据。XmlWriteMode.WriteSchema
我的问题与这篇文章类似:如何将 sql 数据导出到包含 xml 架构的 xml? 但答案并没有提供我需要的解决方案。
答:
0赞
miriamka
10/12/2023
#1
要遵循的几个步骤:
- SQL Server 具有内置的 XQuery 语言支持。你可以使用 XQuery 来编写 XML。并将其打包为存储过程 (SP)。
- 调用 bcp.exe 进程,该进程将从上面的步骤 #1 调用 SP SSIS 在文件系统上输出 XML 文件。
- 通过 SSIS XML 任务操作验证针对 XSD 验证输出 XML 文件。
SSIS 脚本任务
void Main()
{
string exeName = @"c:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\bcp.exe";
string outputFileName = @"e:\Temp\SampleXMLOutput.xml";
string spName = "databaseName.dbo.usp_myStoredProcedure";
string serverName = "serverName";
string tcpPort = "1433";
string sql = string.Format("EXEC {0};"
, spName);
// Create args string
string args = string.Format("\"{0}\" queryout \"{1}\" -T -x -c -C 1252 -a 32768 -S {2},{3}"
, sql
, outputFileName
, serverName
, tcpPort);
// Don't forget to tick/check off System::TaskName variable as ReadOnly in the Task Parameters
Dts.Events.FireInformation(99, Dts.Variables["System::TaskName"].Value.ToString()
, string.Format("bcp arguments: {0}", args), "", 0, ref b);
try
{
// Create new ProcessStartInfo with vars from above
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = exeName;
psi.Arguments = args;
psi.UseShellExecute = false;
psi.RedirectStandardError = true;
psi.RedirectStandardOutput = true;
psi.RedirectStandardInput = true;
psi.CreateNoWindow = true;
psi.ErrorDialog = false;
using (Process process = Process.Start(psi))
{
// Capture StdOut and StdErr into variables
string vStdOutput = process.StandardOutput.ReadToEnd();
string vStdError = process.StandardError.ReadToEnd();
// Wait for exit
process.WaitForExit();
if (!string.IsNullOrEmpty(vStdOutput))
{
Console.WriteLine(vStdOutput);
}
if (!string.IsNullOrEmpty(vStdError))
{
Console.WriteLine(vStdError);
}
Console.WriteLine(string.Format("XML file generation process completed. Exit code: {0}", process.ExitCode));
Console.WriteLine(string.Format("File '{0}' has been created.", outputFileName));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
评论
0赞
Ankit Kumar
10/29/2023
谢谢你的步骤。您能否解释一下如何在执行进程任务中调用 sp。有点挣扎。谢谢!
0赞
miriamka
11/1/2023
我添加了SSIS脚本任务实现以启动步骤#2。可以将所有调用替换为调用,以将其记录到 SSIS 日志中,如我为 bcp 参数所示。Console.WriteLine(...);
评论