シリーズ目次
前置き
今回は、AccessテーブルをSQLSERVER(MSSQL)にストアドでインポートする方法を紹介します。
必要なインストール
- SQLSERVER:Expressでいいです。
- SQLSERVERManagementStudio(SSMS):SQLクライアントならなんでも行けそうなのですが、SQLSERVER扱うならこれが安パイ。デバッグ機能使いたかったら、18.0未満を使いましょう。最新版では廃止されていてすごい使いづらいです。
- Microsoft.ACE.OLEDB.12.0(Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント):16.0もありますが、なぜかちゃんと配布されていないので今回はこちらを使います。
重要なのは、動作bitをすべてそろえてインストールすることです。
ここでは64bitで構成します。
MSさんのリンク先はころころ変わるので、各自最新のリンクをググって使用してください。
機能を有効にする
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- データベースmasterに切り替え | |
USE master | |
-- sp_configure システム ストアド プロシージャの拡張オプションを表示 | |
EXEC sp_configure 'show advanced options', 1; | |
RECONFIGURE; | |
-- アドホック分散クエリを有効 | |
EXEC sp_configure 'Ad Hoc Distributed Queries', 1; | |
RECONFIGURE; | |
-- Microsoft.ACE.OLEDB.12.0の有効化 | |
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess', 1; | |
RECONFIGURE; | |
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters', 1; | |
RECONFIGURE; |
詳しくは下記URLドキュメントを参照
ストアドの構成
持たせる機能は

で、ストアドは以下の通り
このOPENROWSETってやつで、有効化したOLEを指定して、Accessのデータベースに接続します。
「import_table_name」にAccessのテーブル名を入れておけば、同名のテーブルをSQLSERVERに作成できる仕組みです。
もちろん単にSELECTすることもできます。実はExcelもインポートできます。
ね?簡単でしょう?
OPENROWSETについて詳しくなりたい方は下記参照
OPENROWSET (Transact-SQL)
BULK INSERT または OPENROWSET(BULK...) を使用して SQL Server にデータをインポートする
データ型が想定通りに入らない場合は、FORMATFILEを使用して型を指定することもできるようです。
データの一括インポートでのフォーマット ファイルの使用 (SQL Server)
今回は使用しなかったのですが、例えばCSVのインポートを行うときなんかには使えそうです。どこかで検証してみたいです。
ということで今回は「SQLSERVERにAccessテーブルをストアドでインポート」するでした~
- インポートするテーブルの一覧(wk_import_table_names)を取得
- インポート対象テーブルのみインポート
wk_import_table_names

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CREATE PROCEDURE [dbo].[IMPORT_Access] | |
@returnCode INT OUTPUT, | |
@returnMessage VARCHAR(MAX) OUTPUT, | |
@returnTableName VARCHAR(MAX) OUTPUT | |
AS | |
BEGIN | |
SET NOCOUNT ON; | |
DECLARE @SQL NVARCHAR(1000); | |
SET @SQL = ''; | |
--import_table_namesにあるテーブルをすべてインポート | |
--カーソル定義 | |
DECLARE @tableName nvarchar(50) | |
DECLARE @accessName nvarchar(50) | |
DECLARE cursorTableNames CURSOR FOR | |
SELECT | |
import_table_name | |
,source_access_name | |
FROM | |
wk_import_table_names | |
--カーソルオープン | |
OPEN cursorTableNames; | |
--カーソルのフェッチ | |
FETCH NEXT FROM cursorTableNames | |
INTO @tableName,@accessName | |
WHILE @@FETCH_STATUS = 0 | |
BEGIN | |
BEGIN TRY | |
--既存ワークテーブルの削除 | |
SET @SQL = 'DROP TABLE IF EXISTS ' + @tableName + ';'; | |
EXECUTE sp_executesql @SQL; | |
--インポート元Accessの分岐 | |
SET @SQL = 'SELECT * INTO ' + @tableName + ' FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', ''C:\Access\test.accdb'';''admin'';'''' , ''SELECT * FROM ' + @tableName + ''')'; | |
--インポートの実行 | |
EXECUTE sp_executesql @SQL; | |
PRINT @tableName + ' インポート END' | |
--次のカーソルをフェッチ | |
FETCH NEXT FROM cursorTableNames | |
INTO @tableName,@accessName | |
END TRY | |
BEGIN CATCH | |
SET @returnCode = ERROR_NUMBER(); | |
SET @returnMessage = ERROR_MESSAGE(); | |
SET @returnTableName = @tableName; | |
BREAK; | |
END CATCH; | |
END | |
END |
このOPENROWSETってやつで、有効化したOLEを指定して、Accessのデータベースに接続します。
「import_table_name」にAccessのテーブル名を入れておけば、同名のテーブルをSQLSERVERに作成できる仕組みです。
もちろん単にSELECTすることもできます。実はExcelもインポートできます。
ね?簡単でしょう?
OPENROWSETについて詳しくなりたい方は下記参照
OPENROWSET (Transact-SQL)
BULK INSERT または OPENROWSET(BULK...) を使用して SQL Server にデータをインポートする
データ型が想定通りに入らない場合は、FORMATFILEを使用して型を指定することもできるようです。
データの一括インポートでのフォーマット ファイルの使用 (SQL Server)
今回は使用しなかったのですが、例えばCSVのインポートを行うときなんかには使えそうです。どこかで検証してみたいです。
ということで今回は「SQLSERVERにAccessテーブルをストアドでインポート」するでした~
0 件のコメント:
コメントを投稿