SSIS сохранить строковую переменную в текстовом файле - PullRequest
6 голосов
/ 23 июня 2009

Вроде бы все должно быть просто, но пока я не нашел способа сохранить значение, хранящееся в строковой переменной SSIS, в текстовый файл. Я рассмотрел использование назначения плоского файла внутри потока данных, но для этого требуется источник потока данных.

Есть идеи, как это сделать?

Ответы [ 6 ]

7 голосов
/ 23 июня 2009

Вот небольшой пример кода, который работал в SQL CLR на C #. Вам нужно будет использовать VB, если вы на 2005, я верю. Задаче сценария также необходимо, чтобы свойство переменной чтения было установлено в MyVariable, чтобы сделать доступным значение вашей переменной.

// create a writer and open the file

TextWriter tw = new StreamWriter("\\\\server\\share$\\myfile.txt");

// write a line of text to the file

tw.WriteLine(Dts.Variables["MyVariable"].Value);

// close the stream
tw.Close();
6 голосов
/ 23 июня 2009

Использовать задачу скрипта.


Я только что попробовал это. Я создал диспетчер соединений с Файлом, строка подключения которого указывает на файл, в который я хотел записать. Затем я создал строковую переменную, содержащую текст для записи.

Я добавил задачу «Сценарий», указал мою строковую переменную в списке «Только для чтения», затем щелкнул «Изменить сценарий». Сценарий был следующий:

    public void Main()
    {
        ConnectionManager cm = Dts.Connections["File.tmp"];
        var path = cm.ConnectionString;
        var textToWrite = (string)Dts.Variables["User::StringVariable"].Value;
        System.IO.File.WriteAllText(path, textToWrite);

        Dts.TaskResult = (int)ScriptResults.Success;
    }

Это сработало без проблем.

3 голосов
/ 23 марта 2012

Все, что требуется, - это одна строка кода в простой задаче «Сценарий». Никаких других зависимостей, таких как диспетчер соединений, не требуется.

Вот как это будет выглядеть в C #:

public void Main()
{
    string variableValue = Dts.Variables["TheVariable"].Value.ToString();
    string outputFile = Dts.Variables["Path"].Value.ToString();

    System.IO.File.WriteAllText(outputFile, variableValue);

    Dts.TaskResult = (int)ScriptResults.Success;
}

Очевидно, что наиболее важной здесь является строка, содержащая вызов функции WriteAllText.

Переменная Path должна содержать полный путь + имя файла для выходного файла.

0 голосов
/ 31 июля 2017

Допустим, вы не хотите связываться с задачами Script, и у вас нет базы данных, к которой вы можете подключиться, чтобы просто выполнить команду источника данных, например:

SELECT 'Some arbitrary text' 

Есть еще несколько способов использовать задачу Process для чего-то столь же простого, как запись строки текста в файл. Например, вы можете использовать PowerShell с входной переменной, построенной с использованием следующего выражения:

"'"+REPLACE(@[User::Text],"'","''")+"' > '"+REPLACE(@[User::Filename],"'","''")+"'"

Заметьте, я избежал имени файла, потому что одинарные кавычки там допустимы. Также обратите внимание, что я использовал «>» для перенаправления, которое перезаписывает файл, если он существует. Если бы я хотел добавить, я бы использовал '>>'.

Изначально у меня были проблемы с этим методом, когда User :: Text содержал несколько строк. Оказывается, вам нужно несколько дополнительных символов EOL после вашего имени файла, когда команда занимает строки. Как это:

"'"+REPLACE(@[User::Text],"'","''")+"' > '"+REPLACE(@[User::Filename],"'","''")+"'\r\n\r\n"

Использование cmd.exe с echo немного более рискованно, но также может работать при определенных обстоятельствах и имеет гораздо меньше накладных расходов.

P.S. Я заметил, что в некоторых версиях PowerShell содержимое StandardInputVariable игнорируется без этого:

-Command - 

в поле Аргументы. Одиночный знак минус в качестве аргумента команды является «магическим» и задокументирован в https://docs.microsoft.com/en-us/powershell/scripting/powershell.exe-command-line-help. Я считаю, что все версии PowerShell принимают этот параметр, поэтому даже если он не требуется для вашей версии, вы можете включить его, поскольку он не нарушать все и может помешать вашему коду, если PowerShell будет обновлен до версии, которая этого требует.

0 голосов
/ 23 июня 2009

Я сделал это так, как вы описали. У меня уже был определен менеджер соединений oledb, поэтому я использовал OLE DB Source и использовал режим доступа к данным SQL-команды. Я использовал простой запрос:

select getdate() as dt

... просто чтобы убрать это с дороги. Теперь я знаю дату моей переменной тяги. Затем я использовал преобразование производного столбца, чтобы сделать переменные пакета доступными, и записал его в плоский файл.

Элегантный? Нет, но он выполняет свою работу.

0 голосов
/ 23 июня 2009

Можно использовать преобразование «Производный столбец», чтобы записать значение переменной в столбец. Проблема в том, что ему нужен источник для управления, и нет источника данных, который вы можете использовать, который просто выплевывает пустую строку в конвейер.

Таким образом, либо вы переназначаете однострочный источник для управления преобразованием производного столбца, либо делаете то, что предлагает другой ответ, и делаете это с источником Script.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...