0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQL Server 2000へWindows 11環境からコマンドライン(osql, bcpコマンド)でアクセスする

Last updated at Posted at 2023-04-07

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を作る。

pg_to_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)が行を区切る文字列として使用されます。

以上となる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?