Вот один из возможных способов загрузки данных Access в SQL Server, если все таблицы в Access имеют одинаковую структуру.В этом примере будут циклически проходить таблицы в Access, а именно Country
и StateProvince
.Пакет в этом примере создаст эти две таблицы в SQL, если они не существуют, а затем заполнит их данными из Access.
Пошаговый процесс:
Таблицы доступа Country
и StateProvince
показаны на снимках экрана # 1 и # 2 .
В пакете служб SSIS создайте два подключения OLE DB для подключения к SQL Server и Access, как показано на снимке экрана # 3 .Также создайте 3 переменные, как показано на скриншоте # 4 .Переменные SelectQuery
и TableName
должны быть указаны в допустимой таблице в Access.Это необходимо для начальной настройки пакета.Здесь, в этом случае, я выбрал Country
, который существует в Access.
Выберите переменную SelectQuery
и нажмите F4, чтобы просмотреть панель свойств.На панели свойств установите для свойства EvaluateAsExpress
значение True и вставьте выражение "SELECT * FROM " + @[User::TableName]
в свойство Expression
.Это выражение будет соответствовать таблице, в которой в данный момент выполняется цикл.Смотрите скриншоты # 4
Скриншоты # 5 и # 6 показывают, что таблицы dbo.Country
и dbo.StateProvince
не существует в SQL Server.
Настройте вкладку Control Flow
пакета служб SSIS, как показано на снимке экрана # 7 .Поместите Script Task
и подключите его к Foreach Loop container
.Внутри контейнера поместите Execute SQL Task
и Data Flow Task
.
Замените код в задаче сценария на код, указанный в разделе «Код задачи скрипта».Этот код будет зацикливать схему доступа и извлекать только имена таблиц.Список имен таблиц затем сохраняется в переменной пакета AccessTables
, которая затем будет использоваться Foreach loop container
.
В базе данных SQL Server создайте хранимую процедуру с именем dbo.CreateTable
используя скрипт из раздела SQL Scripts .Эта хранимая процедура создаст таблицу в SQL Server, если она еще не существует.Make sure that you alter the table schema defined in the stored procedure according to your needs.
Настройте Foreach loop container
, как показано на снимках экрана # 8 и # 9 .
Настройка задачи «Выполнение SQL», как показано на снимках экрана # 10 и # 11 .
Мы не можем настроить задачу потока данных вэтот момент, потому что таблицы не существуют в SQL Server.Итак, мы выполним пакет на этом этапе, чтобы структуры таблицы Access были созданы в SQL Server.Снимок экрана # 12 показывает пример выполнения пакета.Снимок экрана # 13 показывает, что структуры таблиц созданы в SQL Server, но они еще не заполнены данными.
Теперь мы настроим Data Flow Task
,Поместите OLE DB Source
и OLE DB Destination
в Задачу потока данных.Подключите источник OLE DB к назначению OLE DB.Смотрите скриншот # 14 .
Настройте OLE DB Source
, как показано на скриншотах # 15 и # 16 .
Настройте OLE DB Destination
, как показано на скриншотах # 17 и # 18 .
Снимок экрана # 19 показывает пример выполнения пакета в Data Flow Task
.
Снимок экрана # 20 показывает, что таблицы SQL Server теперь заполнены даннымииз таблиц доступа.
Этот пример будет работать только для таблиц, имеющих одинаковую структуру, но различающихся по имени.Если к Access добавится еще одна таблица с именем Employees
, содержащая только столбцы Id
и Name
.Выполнение этого примера пакета создаст ту же таблицу в SQL Server, а также заполнит ее данными.
Надеюсь, это поможет.
Сценарии SQL:
CREATE PROCEDURE [dbo].[CreateTable]
(
@TableName VARCHAR(255)
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'IF NOT EXISTS ( SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N''[dbo].' + @TableName + ''')
AND type in (N''U''))
CREATE TABLE [dbo].' + @TableName + '(
[ID] [int] NOT NULL,
[Name] [nvarchar](255) NULL
) ON [PRIMARY]'
EXEC (@SQL)
END
GO
Код задачи сценария:
C # код, который можно использовать только в SSIS 2008 and above
.
/*
Microsoft SQL Server Integration Services Script Task
Write scripts using Microsoft Visual C# 2008.
The ScriptMain is the entry point class of the script.
*/
using System;
using System.Collections;
using System.Data;
using System.Data.OleDb;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_9b2714c55db14556be74ca92f345c4e3.csproj
{
[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#region VSTA generated code
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
public void Main()
{
Variables varCollection = null;
DataTable schemaTables = null;
ArrayList tableNames = new ArrayList();
Dts.VariableDispenser.LockForWrite("User::AccessTables");
Dts.VariableDispenser.GetVariables(ref varCollection);
using (OleDbConnection connection = new OleDbConnection(Dts.Connections["AccessDB"].ConnectionString.ToString()))
{
string[] restrictions = new string[4];
restrictions[3] = "Table";
connection.Open();
schemaTables = connection.GetSchema("Tables", restrictions);
}
foreach (DataRow row in schemaTables.Rows)
{
foreach (DataColumn column in schemaTables.Columns)
{
if (column.ColumnName.ToUpper() == "TABLE_NAME")
{
tableNames.Add(row[column].ToString());
}
}
}
varCollection["User::AccessTables"].Value = tableNames;
Dts.TaskResult = (int)ScriptResults.Success;
}
}
}
Скриншот № 1:
Скриншот №2:
Снимок экрана № 3:
Снимок экрана № 4:
Скриншот № 5:
Снимок экрана № 6:
Снимок экрана № 7:
Снимок экрана № 8:
Снимок экрана № 9:
Снимок экрана № 10:
Скриншот № 11:
Скриншот № 12:
Снимок экрана № 13:
Снимок экрана № 14:
Снимок экрана № 15:
Снимок экрана № 16:
Снимок экрана № 17:
Снимок экрана № 18:
Снимок экрана № 19:
Снимок экрана № 20: