SQL Server 2000へWindows 11環境からコマンドライン(osql, bcpコマンド)でアクセスすることが必要になった為、その環境設定手順を記録しておく。
注意事項
- 現行で公式サイトからダウンロードできる最も古いSQL Serverが2008 Expressだった為、それを用いている。
- 但し、さすがに対象が古すぎて、この方法が確実な方法かはわからないので、保証はしない。調べると、SQL Server 2008自体は正式にはSQL Server 2000をサポートしていないようだが、やってみたところとりあえず簡単な参照クエリ、更新クエリは動作したし、bcpコマンドによるインポートも動作した。
ダウンロード先
Microsoft® SQL Server® 2008 Express with Advanced Services
https://www.microsoft.com/ja-jp/download/details.aspx?id=1842
インストーラの実行
SQLEXPRADV_x64_JPN.exe
(1) 「SQL Serverの新規スタンドアロン インストールまたは既存のインストールへの機能の追加」を選択
- .NET Framework 3.5のインストールを要求されるので「OK」を選択します。
※その後、再起動し、インストーラを再度実行して(1)を選択します。
(2) プロダクト キーは規定のまま。 「次へ」を押下し、「セットアップサポートファイル」をインストールする。
(3) SQL Server 2000セットアップ
「機能の選択」から、下記2点を選択する。DBインスタンスの作成などは行う必要がないのでインストールしない。
共有機能
■管理ツール - 基本
■SQLクライアント接続SDK
※目当てのosqlコマンドやbcpコマンドが上記のどちらに入っているかまでは確認していない。
(4) 環境変数にコマンドラインツールのPATHを登録
コントロールパネル → システム → システムの詳細設定
環境変数の設定: システム環境変数 Path に以下を追加
C:\Program Files\Microsoft SQL Server\100\Tools
(5) 接続テスト
ターミナルを開き、任意の場所で以下のコマンドを実行(dbo.yourtable1の部分は適切なテーブル名に変更)
osql -S <host> -d <dbname> -U <user> -Q "select top 1 * from dbo.yourtable1;"
おまけ:PostgreSQL 12環境からTSV形式でエクスポートしたレコードをSQL Server 2000にインポートする
postgresのtable1を、SQL Server 2000 の oldtable1 にインポートしたい。
table1を、oldtable1 の形式に変換するSQLを書く
table1は、古いoldtable1とは列名や形式等が異なる為、変換用のSQLを作る。
\encoding SJIS
\pset fieldsep '\t'
SELECT
org.cd as "cd"
, org.name as "name"
, to_char(org.upd_date, 'YYYY-MM-DD DD24:MI:SS') as "update_date"
, null as "field1"
FROM
table1 as org
;
ポイントは次の通り。下記設定をpsqlのコマンドラインで指定してもうまくいかなかった。
- \encodingをSJISにする。psqlのコマンドラインで指定しても認識されなかった。
- pset fieldsep '\t' でタブ区切りを指定する。psqlのコマンドラインで指定しても、
\t
という文字列が出力されてうまくいかなかった。 - 日付型は、YYYY-MM-DD DD24:MI:SS 形式の文字列にする。
pg_to_oldtable1.sql の実行結果をTSV形式にエクスポートする
psql -h <host> -U <user> -d <dbname> -f pg_to_oldtable1.sql --no-align --tuples-only -o pg_to_oldtable1.tsv
-
--no-align
: 出力を整形しない(省略形は -A) -
--tuples-only
: 列名と結果の行数フッタを表示しない(省略形は -t)
pg_to_oldtable1.tsv を bcp コマンドでSQL Server 2000にインポートする
bcp <dbname>.dbo.oldtable1 in pg_to_oldtable1.tsv -S <host> -U <user> -P <password> -c -t "\t" -r "\n"
-
<dbname>.dbo.oldtable1
- インポート先のデータベース名、スキーマ名、テーブル名を指定します。
-
.
はスキーマ名を省略することを意味します。
-
in pg_to_oldtable1.tsv
- インポート元のファイル名を指定します。
-
in
はファイルがインポート元であることを指定します。
-
-S <host>
- インポート先のSQL Serverインスタンスのホスト名を指定します。
-
-U <user>
- インポート先のSQL Serverインスタンスに接続するためのユーザー名を指定します。
-
-P <password>
- インポート先のSQL Serverインスタンスに接続するためのパスワードを指定します。
-
-c
- データを文字列としてインポートすることを指定します。
- このオプションを指定することで、bcpコマンドはテキストファイルからデータを読み取り、SQL Serverに文字列として挿入します。
-
-t "\t"
- インポート元のファイル内で、データ列を区切るために使用される文字列を指定します。
- この場合、タブ文字(
\t
)がデータ列を区切る文字列として使用されます。
-
-r "\n"
- インポート元のファイル内で、行を区切るために使用される文字列を指定します。
- この場合、改行文字(
\n
)が行を区切る文字列として使用されます。
以上となる。