Accessのすべてのテーブルが同じ構造である限り、AccessデータをSQLServerにロードする方法の1つを次に示します。この例では、Accessのテーブル、つまりCountry
とをループしStateProvince
ます。この例のパッケージは、これら2つのテーブルが存在しない場合はSQLで作成し、Accessからのデータを入力します。
ステップバイステップのプロセス:
テーブルCountry
にアクセスし、スクリーンショット# 1と#2StateProvince
に示されています。
スクリーンショット# 3に示すように、SSISパッケージで、SQLServerとAccessに接続するための2つのOLEDB接続を作成します。また、スクリーンショット#4に示すように、3つの変数を作成します。変数SelectQuery
でありTableName
、Accessの有効なテーブルで指定する必要があります。これは、パッケージの初期構成に必要です。この場合、Country
Accessに存在するを選択しました。
変数SelectQuery
を選択し、F4を押してプロパティペインを表示します。[プロパティ]ペインで、プロパティEvaluateAsExpress
をTrue"SELECT * FROM " + @[User::TableName]
に設定し、式をプロパティに貼り付けExpression
ます。この式は、現在ループスルーされているテーブルに評価されます。スクリーンショット#4を参照してください
スクリーンショット#5と#6は、テーブルdbo.Country
とdbo.StateProvince
がSQLServerに存在しないことを示しています。
スクリーンショット# 7Control Flow
に示すように、SSISパッケージのタブを構成します。を配置し、に接続します。コンテナ内に、とを配置します。Script Task
Foreach Loop container
Execute SQL Task
Data Flow Task
スクリプトタスクのコードを、「スクリプトタスクコード」セクションに記載されているコードに置き換えます。このコードはAccessスキーマをループし、テーブル名のみをフェッチします。次に、テーブル名のリストがパッケージ変数AccessTables
に格納されます。この変数は、によって使用されForeach loop container
ます。
SQL Serverデータベースで、 SQLスクリプトセクションdbo.CreateTable
で提供されているスクリプトを使用して名前が付けられたストアドプロシージャを作成します。このストアドプロシージャは、SQL Serverにテーブルがまだ存在しない場合は、テーブルを作成します。Make sure that you alter the table schema defined in the stored procedure according to your needs.
Foreach loop container
スクリーンショット#8および#9に示すようにを構成します。
スクリーンショット# 10および#11に示すように、SQL実行タスクを構成します。
テーブルがSQLServerに存在しないため、現時点ではデータフロータスクを構成できません。したがって、この時点でパッケージを実行して、Accessテーブル構造がSQLServerに作成されるようにします。スクリーンショット#12は、サンプルパッケージの実行を示しています。スクリーンショット#13は、テーブル構造がSQL Serverで作成されているが、まだデータが入力されていないことを示しています。
次に、を構成しData Flow Task
ます。OLE DB Source
およびOLE DB Destination
をデータフロータスク内に配置します。OLEDBソースをOLEDB宛先に接続します。スクリーンショット#14を参照してください。
OLE DB Source
スクリーンショット#15および#16に示すようにを構成します。
OLE DB Destination
スクリーンショット#17および#18に示すようにを構成します。
スクリーンショット#19は、内のサンプルパッケージ実行を示していますData Flow Task
。
スクリーンショット#20は、SQLServerテーブルにAccessテーブルのデータが入力されていることを示しています。
この例は、構造は同じで名前が異なるテーブルに対してのみ機能します。名前付きの別のテーブルが列と。のみでAccessEmployees
に追加された場合。このサンプルパッケージを実行すると、SQL Serverに同じテーブルが作成され、データも入力されます。Id
Name
お役に立てば幸いです。
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: