ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: BCP.EXE で自動採番列(INT IDENTITY)を持つデータの移行
名前: lightbox
処理選択
パスワード

件名 BCP.EXE で自動採番列(INT IDENTITY)を持つデータの移行
名前 lightbox
コメント
BCP.EXE なので、MSDE( SQLServer ) のお話です。
もう、いまどきは MSDE という名前は無くなりましたが、古いシステムのお話

  ↓[[※コマンドプロンプトで実行するので、改行は本来ありません]]
@DIV
bcp.exe
	db1..[テーブル名]
	out "c:\TEMP\data.csv"
	-c
	-t \t
	-r \0
	-S server_name
	-U user_name
	-P


bcp.exe
	db2..[テーブル名]
	in "c:\TEMP\data.csv"
	-e "c:\TEMP\error.log"
	-c
	-t \t
	-r \0
	-E
	-S server_name\msde2000
	-U sa
	-P password
@END

作業としては、移行ではなくパックアップしたデータを復帰するテストです。

■ db1 は、7.0 の古い MSDE なので、sa にパスワードがありません。
■ データに改行が含まれるので、-r \0 で改行コードを指定しています。
■ 出力では必ずエラーログを出力するようにします( bcp は万能ではありません )
■ -E が INT IDENTITY 列を無視する設定です

移行側のテーブル定義は、SQL-DMO で出力して作成しています。
以下はそのコードで、$キーワード を文字列で置き換えて使っています。

@DIV
' **********************************************************
' 定義テキスト取得
' **********************************************************

Server = "$SERVER"
Db = "$DATABASE"
User = "$USER"
Pass = "$PASS"
ListTable = "$LISTTABLE"
List = Split( ListTable, "," )

Dim objServer,objDatabase,objTable

' **********************************************************
' オブジェクト作成
' **********************************************************
on error resume next
Set objServer = CreateObject("SQLDMO.SQLServer")
if Err.Number <> 0 then
	Wscript.Echo "SQL-DMO はインストールされていません"
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' 接続
' **********************************************************
on error resume next
Call objServer.Connect( Server, User, Pass )
if Err.Number <> 0 then
	Wscript.Echo "接続に失敗しました [" & Err.Description & "]"
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' データーベースオブジェクト取得
' **********************************************************
on error resume next
Set objDatabase = objServer.Databases(Db)
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' テーブルオブジェクト
' **********************************************************
on error resume next
For i = 0 to Ubound( List )
	Set objTable = objDatabase.Tables(List(i))
	if Err.Number <> 0 then
		Wscript.Echo Err.Description
		Wscript.Quit
	end if

	strDrop = "if exists(select * from sysobjects where name = '"
	strDrop = strDrop & objTable.Name & "'" & " and type = 'U')" & vbCrLf
	strDrop = strDrop & "	drop table " & objTable.Name & vbCrLf
	strDrop = strDrop & "go" & vbCrLf
	Wscript.Echo strDrop

	Wscript.Echo objTable.Script()
	Set objTable = Nothing
	objTable = Empty
Next
on error goto 0


' **********************************************************
' 切断
' **********************************************************
Call objServer.DisConnect()
@END


http://msdn.microsoft.com/ja-jp/library/aa174646.aspx(BCP のパラメータに関する Microsoft のドキュメント)


@LINE
関連する http://winofsql.jp/(SQLの窓)へのドキュメントへのリンク
http://winofsql.jp/VA003334/dbaccess050907172814_050907173941.htm(自動採番列《SQLServer》)

関連する Microsoft のドキュメントへのリンク
http://msdn.microsoft.com/ja-jp/library/ms188365.aspx(BULK INSERT)