这是一种可以实现将 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显示 SQL Server 中不存在这些dbo.Country
表dbo.StateProvince
。
配置Control Flow
SSIS 包的选项卡,如屏幕截图 # 7所示。放置 aScript Task
并将其连接到 a Foreach Loop container
。在容器内,放置 anExecute SQL Task
和 a Data Flow Task
。
将脚本任务中的代码替换为脚本任务代码部分下给出的代码。此代码将循环访问模式并仅获取表名。然后将表名列表存储在包变量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所示。
配置执行 SQL 任务,如屏幕截图 # 10和 # 11所示。
此时我们无法配置数据流任务,因为 SQL Server 中不存在这些表。因此,我们将在此时执行包,以便在 SQL Server 中创建 Access 表结构。屏幕截图 # 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
脚本任务代码:
只能在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: