Каков код EzAPI для использования источника OLE DB с режимом доступа к данным «SQL-команда из переменной» и назначить переменная?
Раз в месяц нам нужно обновлять наш общедоступный тестовый сайт подмножествами производственных данных. Мы определили, что для наших нужд решение SSIS лучше всего подходит для выполнения этой задачи.
Моя цель - систематически создавать большое количество (более 100) пакетов «репликации». EzAPI - это удобная оболочка для объектной модели SSIS , которая кажется отличным способом сэкономить щелчки мышью.
Я бы хотел, чтобы мои пакеты выглядели так:
User :: sourceQuery
Это код для моего пакета репликации таблицы в таблицу.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.SSIS.EzAPI;
using Microsoft.SqlServer.Dts.Runtime;
namespace EzApiDemo
{
public class TableToTable : EzSrcDestPackage
{
public TableToTable(Package p) : base(p) { }
public static implicit operator TableToTable(Package p) { return new TableToTable(p); }
public TableToTable(string sourceServer, string database, string table, string destinationServer) : base()
{
string saniName = TableToTable.SanitizeName(table);
string sourceQuery = string.Format("SELECT D.* FROM {0} D", table);
// Define package variables
this.Variables.Add("sourceQuery", false, "User", sourceQuery);
this.Variables.Add("tableName", false, "User", table);
// Configure DataFlow properties
this.DataFlow.Name = "Replicate " + saniName;
this.DataFlow.Description = "Scripted replication";
// Connection manager configuration
this.SrcConn.SetConnectionString(sourceServer, database);
this.SrcConn.Name = "PROD";
this.SrcConn.Description = string.Empty;
this.DestConn.SetConnectionString(destinationServer, database);
this.DestConn.Name = "PREPROD";
this.DestConn.Description = string.Empty;
// Configure Dataflow's Source properties
this.Source.Name = "Src " + saniName;
this.Source.Description = string.Empty;
this.Source.SqlCommand = sourceQuery;
// Configure Dataflow's Destination properties
this.Dest.Name = "Dest " + saniName;
this.Dest.Description = string.Empty;
this.Dest.Table = table;
this.Dest.FastLoadKeepIdentity = true;
this.Dest.FastLoadKeepNulls = true;
this.Dest.DataSourceVariable = this.Variables["tableName"].QualifiedName;
this.Dest.AccessMode = AccessMode.AM_OPENROWSET_FASTLOAD_VARIABLE;
this.Dest.LinkAllInputsToOutputs();
}
///
/// Sanitize a name so that it is valid for SSIS objects.
/// Strips []/\:=
/// Replaces . with _
///
///
///
public static string SanitizeName(string name)
{
string saniName = name.Replace("[", String.Empty).Replace("]", string.Empty).Replace(".", "_").Replace("/", string.Empty).Replace("\\", string.Empty).Replace(":", string.Empty);
return saniName;
}
}
}
Вызов выглядит как TableToTable s2 = new TableToTable (@ "localhost \ localsqla", "AdventureWorks", "[HumanResources].[Department] ", @" localhost \ localsqlb ");
, и это создает пакет, который делает то, что я хочу , за исключением для использования переменной в источнике.
Вышеупомянутое код предоставляет режим доступа как SQL-запрос, а запрос встроен в OLE Source. Желание использовать «SQL-команду из переменной», и эта переменная @ [User :: sourceQuery]
Что я stuck on использует переменную в источнике.
Это должно быть простым вопросом назначения чего-то вроде
this.Source.DataSourceVariable = this.Variables["sourceQuery"].QualifiedName;
this.Source.AccessMode = AccessMode.AM_SQLCOMMAND_VARIABLE;
Это приводит к выбору правильного режима доступа к данным, но переменная не заполняется.
Вы можете заметить, что я выполняю аналогичный шаг в пункте назначения, который принимает переменную и работает «правильно».
this.Dest.DataSourceVariable = this.Variables["tableName"].QualifiedName;
this.Dest.AccessMode = AccessMode.AM_OPENROWSET_FASTLOAD_VARIABLE;
Перечисление перестановок, которые я попытка
this.Source.AccessMode = AccessMode.AM_OPENROWSET;
Результаты в режиме доступа к данным установлены на Таблица или Представление, а имя таблицы или представление пусто.
this.Source.AccessMode = AccessMode.AM_OPENROWSET_VARIABLE;
Для результатов в режиме доступа к данным задано значение «Переменная имени таблицы или представления», а имя переменной - sourceQuery. Очень близко к тому, что я хочу, за исключением того, что режим доступа не правильный. Если бы этот пакет запускался, он бы взорвался, поскольку OpenRowSet ожидал бы прямого имени таблицы.
this.Source.AccessMode = AccessMode.AM_SQLCOMMAND;
Для результатов в режиме доступа к данным установлено значение «Команда SQL», а текст команды SQL - «User :: sourceQuery». Это буквальное значение имени переменной, так что это правильно, но поскольку режим доступа неправильный, это не так. т работать.
this.Source.AccessMode = AccessMode.AM_OPENROWSET_FASTLOAD;
this.Source.AccessMode = AccessMode.AM_OPENROWSET_FASTLOAD_VARIABLE;
Ни один из этих режимов доступа не является правильным, поскольку они предназначены для пунктов назначения (я все еще пробовал их, но они не работали должным образом).
На этом этапе я подумал, что попробую действовать в обратном направлении, создав пакет, в котором источник OLE DB определен так, как я хочу, а затем проверил свойства исходного объекта.
Application app = new Application();
Package p = app.LoadPackage(@"C:\sandbox\SSISHackAndSlash\SSISHackAndSlash\EzApiPackage.dtsx", null);
TableToTable to = new TableToTable(p);
В моем коде для SqlCommand и DataSourceVarible задано полное имя переменной. Я снял набор изменений 65381 и скомпилировал его (после исправления некоторых ссылок на библиотеки DLL SQL Server 2012) в надежде, что после стабильной сборки от 30 декабря 2008 г. могло быть исправление, но безрезультатно.
Обнаружил ли я ошибку в их коде или просто что-то упустил?