根据 XML 架构文件将 SQL Server 数据导出到 XML

Export SQL Server data to XML as per XML schema file

提问人:Ankit Kumar 提问时间:10/12/2023 最后编辑:marc_sAnkit Kumar 更新时间:11/1/2023 访问量:73

问:

我有一个包含多个元素和属性的(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? 但答案并没有提供我需要的解决方案。

C# sql-server xml ssis xsd

评论

0赞 jdweng 10/12/2023
使用以下查询:SELECT * FROM INFORMATION_SCHEMA。列 CO 在哪里 CO.TABLE_CATALOG = 'YOUR DATABASE' 按TABLE_NAME排序,ORDINAL_POSITION

答:

0赞 miriamka 10/12/2023 #1

要遵循的几个步骤:

  1. SQL Server 具有内置的 XQuery 语言支持。你可以使用 XQuery 来编写 XML。并将其打包为存储过程 (SP)。
  2. 调用 bcp.exe 进程,该进程将从上面的步骤 #1 调用 SP SSIS 在文件系统上输出 XML 文件。
  3. 通过 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(...);