SQL-запрос к плоскому файлу csv с заголовком столбца, столбцом-разделителем; и двойные кавычки квалификатора текста

Я хотел бы экспортировать SQL-запрос в плоский файл csv в ExecuteProcessTask в SSIS.

Я не могу увидеть экспорт с заголовком, разделителем и квалифицировать его как текст. Я пробовал с sqlcmd и bcp.

Для информации я обязан использовать SELECT *, потому что представление в FROM является переменной, и мне нужно отобразить весь столбец.

С sqlcmd:

sqlcmd -S  ServerName -d dbName -E -Q "SELECT * FROM vPBI_Tasks WHERE [project Leader] like 'ProjectLeaderName'" -o "exportFile.csv" -W -s";"

Извлечь результат:

Scope;Project type;Activity type;OBS;Customer;Contr...
-----;------------;-------------;---;--------;-----...
ESP;ESP - Amendment;NULL;NULL;GSA;ESP_Amendment#13;...
ESP;ESP - Amendment;NULL;NULL;GSA;ESP_Amendment#13;...
ESP;ESP - Amendment;NULL;NULL;GSA;ESP_Amendment#13;...

Мне бы хотелось :

"Scope";"Project type";"Activity type";"OBS";"Customer";"Contra..."
ESP";"ESP - Amendment";"NULL";"NULL";"GSA";"ESP_Amendment#13";""
ESP";"ESP - Amendment";"NULL";"NULL";"GSA";"ESP_Amendment#13";""
ESP";"ESP - Amendment";"NULL";"NULL";"GSA";"ESP_Amendment#13";""

С помощью bcp:

bcp "SELECT * FROM vPBI_Resources WHERE [project Leader] like 'ProjectLeaderName'" queryout "exportFile.csv" -c -t ; -S ServerName -T

Результат :

  • У меня нет заголовка
  • У меня нет квалификатора текста

person GaelB    schedule 24.07.2019    source источник
comment
Я не могу увидеть экспорт с заголовком, разделителем и квалифицировать его как текст где вы смотрите? Это четкие параметры в параметрах здесь и здесь в источнике данных в виде плоского файла.   -  person Larnu    schedule 24.07.2019
comment
В bcp или sqlcmd. Я не использую классическое назначение данных в виде плоских файлов, я использую редактор задач «Выполнить процесс», потому что я не могу использовать соединение с плоскими файлами.   -  person GaelB    schedule 24.07.2019
comment
SQL-запрос - это регулярное выражение: SELECT * FROM + @ [User :: SQLView] + WHERE + @ [User :: WhereClause]   -  person GaelB    schedule 24.07.2019
comment
потому что я не могу подключиться к плоскому файлу. почему бы и нет? Это сделает то, что вам здесь нужно, тривиальным.   -  person Larnu    schedule 24.07.2019
comment
У меня проблема в том, что если я создаю соединение с плоским файлом, мне нужно определить имена и количество экспортируемых столбцов, но это зависит от @User :: SQLView. Я падаю, может быть?   -  person GaelB    schedule 24.07.2019


Ответы (2)


См. Ответ на более ранний аналогичный запрос:

Пакет BCP SQL Server вставить вертикальную черту с разделителями из файла формата текстового квалификатора

По сути, вам нужно использовать файл формата BCP. При создании команды BCP включите параметр -f и укажите расположение файла формата. В файле формата вы указываете свой разделитель не просто как символ точки с запятой, а как ";" (это два символа двойных кавычек с точкой с запятой между ними).

Это немного больше, но остальное есть по ссылке.

Чтобы включить заголовок, вам просто нужно использовать 2 запроса. Один запрос будет для заголовка, а другой - для подробных записей. Вы можете «объединить» два запроса вместе, используя опцию «queryout» BCP. Вам нужно будет преобразовать все ваши подробные данные в типы данных varchar, чтобы их можно было запрашивать вместе в один файл. Но поскольку вы все равно переходите к текстовому файлу, это не должно вызывать проблем. Есть и другие ответы, в которых подробно описано, как включить заголовок таким образом. Я добавлю один в ближайшее время в качестве редактирования. Вы также можете запросить заголовок и подробные записи как два отдельных файла (2 отдельные команды bcp) и просто объединить их вместе с помощью команды OS / script.

person jamie    schedule 24.07.2019

Я действительно думал об этом решении, но меня смутила проблема добавления двойных кавычек в начале и в конце строки.

Обходное решение, которое я нашел, - это сценарий на C #. http://neil037.blogspot.com/2013/07/ssis-script-task-to-export-data-from.html

Я поместил код C # ниже, он будет использоваться другими людьми :).

public void Main()
    {

        String filePath = Dts.Variables["User::temporyExportFilePath"].Value.ToString();
        Dts.TaskResult = (int)ScriptResults.Success;
        CreateCSVFile(GetTableData(), filePath);

    }

    public DataTable GetTableData()
    {

        String sqlQuery = Dts.Variables["User::sqlQuery"].Value.ToString();
        String connectionString = Dts.Variables["User::stringDatabaseConnection"].Value.ToString();
        SqlConnection connect = new SqlConnection(connectionString);

        SqlCommand cmd = new SqlCommand(sqlQuery, connect);
        cmd.CommandType = CommandType.Text;
        SqlDataAdapter adap = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        adap.Fill(dt);
        return dt;
    }


    public void CreateCSVFile(DataTable dt, string strFilePath)
    {
        StreamWriter sw = new StreamWriter(strFilePath, false);
        int iColCount = dt.Columns.Count;
        for (int i = 0; i < iColCount; i++)
        {
            // Write text qualifier double-quote + value + double-quote
            sw.Write("\"" + dt.Columns[i] + "\"");
            if (i < iColCount - 1)
            {
                //Parser
                sw.Write(";");
            }
        }
        sw.Write(sw.NewLine);
        // Now write all the rows.
        foreach (DataRow dr in dt.Rows)
        {
            for (int i = 0; i < iColCount; i++)
            {
                if (!Convert.IsDBNull(dr[i]))
                {
                    // Write text qualifier double-quote + value + double-quote
                    sw.Write("\"" + dr[i].ToString() + "\"");
                }
                if (i < iColCount - 1)
                {
                    //Parser
                    sw.Write(";");
                }
            }
            sw.Write(sw.NewLine);
        }
        //Close file and all data writing
        sw.Close();
    }
person GaelB    schedule 26.07.2019