【问题标题】:export multiple table with ssis使用 ssis 导出多个表
【发布时间】:2017-10-17 07:36:12
【问题描述】:

我有2张表是这样的(Table1和Table2)

ID  NAME             No      Addrress     Notes
------------        ----------------------------
1   John            111      USA          Done
2   Steve           222      Brazil       Done

现在我想创建一个 SSIS 包,它将创建一个 csv 文件,例如:

Table1;ID;NAME             
Table2;No;Addrress;Notes  
"Detail1";"1";"John";"2";"Steve"           
"Detail2";"111";"USA";"Done";"222";"Brazil";"Done"

我们可以实现相同的输出吗?我在谷歌上搜索过,但没有找到任何解决方案。

请帮忙....

【问题讨论】:

  • 看起来很简单,但我想知道你为什么想要这种格式?
  • SAP 需要此文件用于集成数据
  • 难道没有使用 SQL Server 的 SAP 迁移工具吗?或者像 SSIS 的 SAP 连接器?你是不是别无选择,只能先以这种格式导出为csv?
  • 到目前为止你尝试过什么?解决它的一种方法是将结果集从表格转换为 XML,并将标签的字符替换为 csv 分隔符。
  • 如果您使用的是 SQL Server 2017,您可以使用 String_agg()。

标签: sql-server ssis export-to-excel


【解决方案1】:

您可以创建一个script task 来为您生成一个可以处理您的问题的 CSV 文件:

你可以试试这个:

 SqlConnection sqlCon = new SqlConnection("Server=localhost;Initial Catalog=LegOgSpass;Integrated Security=SSPI;Application Name=SQLNCLI11.1");

        sqlCon.Open();
        SqlCommand sqlCmd = new SqlCommand(@"Select ID,Name from dbo.Table1", sqlCon);
        SqlDataReader reader = sqlCmd.ExecuteReader();


        string fullpath = @"C:\Users\thoje\Desktop\stack\New folder\table1.csv";
        StreamWriter sw = new StreamWriter(fullpath);
        object[] output = new object[reader.FieldCount];

        for (int i = 0; i < reader.FieldCount; i++)
            output[i] = reader.GetName(i);

        sw.WriteLine(@"Table1;"+string.Join(";", output));

        List<object> values = new List<object>();
        while (reader.Read())
        {
            reader.GetValues(output);

            values.Add($"\"{output[0]}\"");
            values.Add($"\"{output[1]}\"");



        }

        sw.WriteLine(@"""Detail1"";"+ string.Join(";", values));
        sw.Flush();
        sw.Close();
        reader.Close();
        sqlCon.Close();


        Dts.TaskResult = (int)ScriptResults.Success;

结果:

【讨论】:

    【解决方案2】:

    您确实应该提出您迄今为止所尝试的问题,这对您有很大帮助,并且让帮助人们变得更有趣。

    我在 t-sql 中可以想到的两种解决方法仍然需要您在代码中指定列名。您可以通过使用动态 SQL 并创建一个视图来解决此问题,该视图以相同的方式为您需要的所有表输出数据。

    如果 SSIS 更适合您,您可以使用 BIML 的动态方法。

    --Option 1 (SQL Server 2008 R2 and later)
    with Table1 AS (
    SELECT * FROM (values(1,'John'),(2,'Steve')) AS x(ID,NAME)
    )
    ,Table2 AS (
    SELECT * FROM (values(111,'USA','Done'),(222,'Brazil','Done'))AS y(No,Addrress,Notes)
    )
    SELECT '"Detail1"'+ CAST(foo as VARCHAR(4000))
    FROM (
    SELECT ';"' + CAST(ID AS VARCHAR(4))+'";"' + [NAME] +'"'  FROM Table1 FOR XML PATH('')
    ) AS bar(foo)
    UNION ALL
    SELECT '"Detail2"'+ CAST(foo as VARCHAR(4000))
    FROM (
    SELECT ';"' + CAST([No] AS VARCHAR(4))+'";"' + [Addrress] +'";"' + [Notes] +'"'  FROM Table2 FOR XML PATH('')
    ) AS bar(foo)
    
    
    
    --Option 2 (SQL Server 2017 and later)
    with Table1 AS (
    SELECT * FROM (values(1,'John'),(2,'Steve')) AS x(ID,NAME)
    )
    ,Table2 AS (
    SELECT * FROM (values(111,'USA','Done'),(222,'Brazil','Done'))AS y(No,Addrress,Notes)
    )
    SELECT '"Detail1";' + STRING_AGG('"'+CAST(ID AS varchar(4))+'";"'+[NAME]+'"',';') FROM Table1
    UNION ALL
    SELECT '"Detail2";' + STRING_AGG('"'+CAST([No] AS varchar(4))+'";"'+[Addrress]+'";'+'"'+[Notes]+'"',';') FROM Table2
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      相关资源
      最近更新 更多