SSIS - выгрузить в XML и отправить на FTP
Постановка задачи такая - выгрузить данные в XML и отправить по FTP. Плюс к этому, пароль от FTP может регулярно меняться.
В итоге пакет выглядит так:

Чтоб FTP Task мог использовать файл из connection manager-а "users.xml" (так называлось в моём случае) тип использования должен быть не "Create File", а "File Exists". Но файла то нет вначале.
Кроме того, пароль к FTP хочется менять как-то снаружи пакета и не налетать на защиту. Для решения этой проблемы служит задача "Sef FTP password and change file usage type":
public void Main()
{
ConnectionManager FTPConnectionManager, FileConnectionManager;
//Set variable to an existing connection manager
FTPConnectionManager = Dts.Connections["FTPServer"];
//Set connection manager property "ServerPassword"
FTPConnectionManager.Properties["ServerPassword"].SetValue(FTPConnectionManager, Dts.Variables["FTPPassword"].Value);
FileConnectionManager = Dts.Connections["users.xml"];
FileConnectionManager.Properties["FileUsageType"].SetValue(FileConnectionManager, DTSFileConnectionUsageType.FileExists);
Dts.TaskResult = (int)ScriptResults.Success;
}
Для задачи "FTP Task" нужно установить свойство DelayValidation = true. Разумеется переменную "FTPPassword" выносим в конфигурацию.
В Data Flow задаче для записи используется Script Component и там есть есть другой момент — как записать XML, чтоб при этом атрибут Encoding был указан? Решения найти можно, приведу своё:
XmlTextWriter xw;
public override void PreExecute()
{
base.PreExecute();
StreamWriter output = new StreamWriter(
new FileStream(Connections.Conn2xmlfile.ConnectionString, FileMode.Create),
System.Text.Encoding.UTF8); // definition by StreamWriter made for encoding="UTF-8" attribute
xw = new XmlTextWriter(output);
xw.WriteStartDocument();
xw.WriteStartElement("rootElement");
}
public override void PostExecute()
{
base.PostExecute();
xw.WriteEndElement();
xw.WriteEndDocument();
xw.Close();
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
xw.WriteStartElement("recordElement"); // open block
xw.WriteElementString("fieldElement1", Row.Col1);
xw.WriteElementString("fieldElement2", Row.Col2);
...
xw.WriteEndElement(); // close block
}
На выходе получается XML вида:
<?xml version="1.0" encoding="utf-8"?>
<rootElement>
<recordElement>
<fieldElement1>..</fieldElement1>..
</recordElement>..
</rootElement>