Сохраните / запишите значение переменной в SSIS для следующего выполнения - PullRequest
0 голосов
/ 25 февраля 2019

В настоящее время я экспортирую данные из базы данных в файлы XML.Это работает очень хорошо.В зависимости от объема данных файл XML состоит только из одного набора данных или сотен.Этот процесс запускается ежедневно.Теперь наборы данных должны иметь свойство, подобное «FileNo», которое должно быть нулевым в начале, а затем всегда увеличиваться на единицу.Теперь я видел, что в SSIS есть foreach-контейнеры и for-контейнеры.К сожалению, я боюсь, что использование такого контейнера дает всем наборам данных один и тот же «FileNo» в день, и поэтому они не все вызываются правильно.Кроме того, я не знаю, возможно ли в SSIS кэшировать последнее значение переменной «FileNo» где-нибудь, чтобы на следующий день можно было использовать следующее более высокое значение «FileNo» и не начинать заново с нуля...

У вас есть идея, как посчитать такую ​​переменную и сохранить ее где-нибудь, чтобы снова вызвать ее на следующий день?В итоге все должно выглядеть так:

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Я постараюсь разделить ваш вопрос на две части:

  1. Увеличение переменной FileNo в каждом цикле
  2. Сохранение последних значений файла

Увеличение переменной FileNo в каждом цикле

Чтобы увеличить значение в каждом цикле, самый простой способ - использовать задачу выражения в контейнере цикла foreach с аналогичным выражением:

@[User::FileNo] = @[User::FileNo] + 1

Для получения дополнительной информации вы можете обратиться к следующему ответу:

Сохранение последних значений файла

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

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

Я приведу несколько ссылок, которые могут помочь реализовать этопроцесс:

Чтение значения из базы данных

Чтение и сохранение значения из плоского файла с использованием c #

0 голосов
/ 25 февраля 2019

AC # Script Task может использоваться для получения последнего FileNo значения.Как только это будет сделано, переменная SSIS может быть обновлена ​​для ее хранения, и вы можете сохранить ее, зарегистрировав ее в виде таблицы или другого метода.Другой вариант - хранить в таблице непосредственно в задаче сценария.Обе эти опции описаны ниже.В сценарии свойство DateTime.Now также сохраняется как метка времени.В приведенном ниже примере показано получение последнего FileNo из элемента и атрибута XML с использованием метода LastOrDefault из LINQ .Этот метод возвращает значение по умолчанию, если элементы не найдены, тогда как метод Last в этом случае выдаст ошибку.Используемый путь XML, конечно, является примером, и его нужно будет изменить на свой путь.

using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Xml.Linq;


string xmlFile = Dts.Variables["User::XMLFilePath"].Value.ToString();  

//load xml document       
XDocument xmlDoc = XDocument.Load(xmlFile);

//get last FileNo value
string lastFileNoElement = xmlDoc.Elements("Root").Elements("Element1").
                    Elements("Element2").Elements("FileNo").LastOrDefault().Value.ToString();
string lastFileNoAttribute = xmlDoc.Elements("Root").Elements("Element1")
                    .Elements("Element2").Attributes("FileNo").LastOrDefault().Value.ToString();

//update ssis variable (element)
Dts.Variables["User::FileNoElement"].Value = lastFileNoElement;
//update ssis variable (attribute)
Dts.Variables["User::FileNoAttribute"].Value = lastFileNoAttribute;

//create connection
string connStr = @"Data Source=YourServer;Initial Catalog=Database;Integrated Security=true";
string cmd = "INSERT INTO Schema.LoggingTable (FileNoAttribute, FileNoElement, ExecutionTime) values(@atName, @eleName, @execTime)";
using (SqlConnection conn = new SqlConnection(connStr))
{
    SqlCommand sql = new SqlCommand(cmd, conn);
    //attribute parameter
    SqlParameter aParam = new SqlParameter("@atName", SqlDbType.VarChar);
    aParam.Size = 50;
    aParam.Direction = ParameterDirection.Input;
    aParam.Value = lastFileNoAttribute;
    //element parameter
    SqlParameter eParam = new SqlParameter("@eleName", SqlDbType.VarChar);
    eParam.Size = 50;
    eParam.Direction = ParameterDirection.Input;
    eParam.Value = lastFileNoElement;

    //timestamp
    SqlParameter dateParam = new SqlParameter("@execTime", SqlDbType.DateTime);
    dateParam.Direction = ParameterDirection.Input;
    dateParam.Value = DateTime.Now;

    sql.Parameters.Add(aParam);
    sql.Parameters.Add(eParam);
    sql.Parameters.Add(dateParam);

    conn.Open();
    //insert data
    sql.ExecuteNonQuery();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...