65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 TSQL 脚本将数据从 Excel 或 Access 导入 SQL Server

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (6投票s)

2007年11月17日

3分钟阅读

viewsIcon

177121

一篇关于在不使用向导的情况下将数据从外部数据源导入 SQL Server 的文章。

引言

在使用了 The Code Project 网站多年来寻求解决方案的帮助后,我觉得是时候开始自己做贡献了。 这是我的第一篇文章,请多多包涵。

背景

是否曾需要从 Access 将数据导入 SQL Server,而这需要比 SSIS 向导允许的更多调整? 是否想过是否可以使用 T-SQL 脚本完成?

作为一名专业开发人员,我经常需要在“上线”之前将数据从旧系统(Excel 和 Access)导入到 SQL Server。 通常,这可以使用 SQL Server SSIS 向导完成。 在最近一次,我发现自己需要将数据从一个单表 Access 系统导入到 38 个关系型 SQL 表。 原始数据一团糟,在导入之前需要大量清理和转换。

由于有超过一百万行数据(大部分存储为 Access 文本字段),我需要一个能以最简单方式自动化流程的解决方案。 考虑到这一点,我开始研究 SQL 脚本,通过它们我可以操作数据(例如,在首先将国家/地区名称插入到国家/地区表中作为一个简单的例子之后,用查找代码替换国家/地区名称),从而创建一个完全关系化的模型,其中包含提供的源数据。

Using the Code

此处显示的示例可以从 SQL Server Management Studio 或 O-SQL 命令中使用。

在使用该示例之前,您必须在 SQL Server 2005 中允许 AdHoc 远程查询。为此,请从 SQL Server 2005 安装目录启动 Surface Area Configuration 工具,然后选择“功能”的 Surface Area Configuration。

选择您希望在其上执行导入的服务器,然后在组件列表中选择标题为“Ad Hoc Remote Queries”的条目。 在页面右侧,确保选中“启用 OPENROWSET OPENDATASOURCE”的复选框。 应用您的更改并关闭该工具。

现在是有趣的部分!

我使用了一个临时表来导入数据,因为它是一次性导入,但没有任何阻止您使用永久表完成此任务的方法。

然后,第一个任务是创建您的表(此示例使用临时表,因此在表名前面有 #。 要创建永久表,只需指定表名,不要使用开头的 #)

CREATE TABLE [dbo].[#tblImport](
    [Field1] [int] not null,
    [Field2] [varchar] (255) null,
    [Field3] [varchar] (255) null,
    [Field4] [datetime] null)

现在我们需要从外部源获取数据。

我使用的源是一个 Access 数据库,它有“非法”字段名,例如空格、& 符号等。我将数据导入 SQL Server 的唯一方法是明确指定源和目标字段。

要打开 Access 数据源,您可以使用 SQL 命令 OPENDATASOURCE 如下

OPENDATASOURCE(provider_name,init_string)

因此,假设 Access 数据源名为My Database.mdb,并且位于C: 驱动器的根目录下,则 OPENDATASOURCE 语句如下所示

OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','C:\My Database.mdb')

现在我们需要导入数据。 在我的例子中,我只有一个表需要导入,但必须将其转换为多个 SQL 表。 获得源数据后,您可以使用标准的 T-SQL 语句来完成您需要做的任何事情。

要将数据导入到上面创建的临时表中,请使用以下内容

INSERT INTO [dbo].[#tblImport]
    Field1,Field2,Field3,Field4
SELECT [Field1],[Field2],[Field3],[Field4] FROM OPENDATASOURCE_
    ('Microsoft.Jet.OLEDB.4.0','C:\My Database.mdb')...[TableName]

请注意该语句末尾的 ...[TableName]。 三个点是必不可少的,TableName 是您要从中导入的源表的名称。

上述导入阶段完成后,根据需要转换数据以导入到您的 SQL 表中。

如果像我一样,您使用临时表进行初始导入,请不要忘记在完成后删除它!!

 DROP TABLE [dbo].[#tblImport]

结论

使用 T-SQL 导入数据是控制最终结果的一种非常强大的方法,如果您精通 SQL,您可以使用导入的数据进行转换的可能性是无限的。

© . All rights reserved.