■閉鎖した昔のブログの記事復活
[2025/05/10] SQL-Serverのユーティリティ(BCP)を利用したテーブルへのインポート・エキスポート (No.381)
[2025/05/10] SQL-Serverのプロシージャ生成のバッチ実行 (No.380)
[2025/05/10] SQL-Serverの関数・プロシージャのVB.NETでの実行 (No.379)
[2025/05/10] asp.netアプリをコーディング中にコンパイル不能状態 (No.378)
[2025/05/10] 「おやじプログラマー日記」の復活について (No.377)
[2025/05/10] SQL-Serverのプロシージャ生成のバッチ実行 (No.380)
[2025/05/10] SQL-Serverの関数・プロシージャのVB.NETでの実行 (No.379)
[2025/05/10] asp.netアプリをコーディング中にコンパイル不能状態 (No.378)
[2025/05/10] 「おやじプログラマー日記」の復活について (No.377)
-
SQL-Serverのテーブルの内容を簡単にインポート・エキスポートできる、ユーティリティ(BCP)の忘備録です。
BCPはコマンドラインで使用するEXEファイルで、MSSQLをインストールした時点でユーティリティとして "C:\Program Files\Microsoft SQL Server\90\Tools\Binn"の様なディレクトリに存在するはずです。
パスも通っているはずですから、DOS窓から「BCP」を実行すれば動作するはずです。
(引数無しで実行するとヘルプが表示されます。以下を参照)C:\>bcp 使用法: bcp {dbtable | query} {in | out | queryout | format} datafile [-m 最大エラー数] [-f フォーマット ファイル] [-e エラー ファイル] [-F 先頭行] [-L 最終行] [-b バッチ サイズ] [-n ネイティブ型] [-c 文字型] [-w UNICODE 文字型] [-N text 以外のネイティブ型を保持] [-V ファイル フォーマットのバージョン] [-q 引用符で囲まれた識別子] [-C コード ページ指定子] [-t フィールド ターミネータ] [-r 行ターミネータ] [-i 入力ファイル] [-o 出力ファイル] [-a パケット サイズ] [-S サーバー名] [-U ユーザー名] [-P パスワード] [-T 信頼関係接続] [-v バージョン] [-R 地域別設定有効] [-k NULL 値を保持] [-E ID 値を保持] [-h "読み込みヒント"] [-x XML フォーマット ファイルを生成]
各種の引数があって、いろいろな使い方ができますが、私が基本的に使っている方法を記します。
尚、実行はMSSQLがインストールされているサーバ上で実行しています。
■テーブルをテキストファイルに出力する
テスト用のデータベースである「TEST」と、そのDB内のテスト用テーブル「TABLE_A」の内容全てを テキストファイル「table_a.txt」に出力する方法です。
C:\>bcp TEST.dbo.TABLE_A out "table_a.txt" -c -S localhost\SQLEXPRESS -T コピーを開始しています... 2 行コピーされました。 ネットワーク パケット サイズ (バイト): 4096 クロック タイム (ミリ秒) 合計 : 1 平均 : (2000.00 行/秒)
出力結果はテーブルのカラムの区切り記号としてタブ文字が使われます。また、文字コードはShift-JISです。
(尚、実行はCドライブのルートで実行しています。) 最後の引数の「-T」は、Windows認証の指定ですが、SQL Server認証の場合は「-T」の代わりに「-U」「-P」を用います。
================================================================================
-U [ユーザ名] -P [パスワード]
================================================================================
■SQLの結果をテキストファイルに出力する
上記の説明で使用したテーブル「TABLE_A」を対象としたSQL文の結果をテキストファイル「table_b.txt」に出力する方法です。
C:\>bcp "SELECT * FROM TEST.dbo.TABLE_A ORDER BY ID" queryout "table_b.txt" -c -Slocalhost\SQLEXPRESS -T コピーを開始しています... 2 行コピーされました。 ネットワーク パケット サイズ (バイト): 4096 クロック タイム (ミリ秒) 合計 : 1 平均 : (2000.00 行/秒)
最初のコマンドの引数と異なるところは、SQL文を指定するところと、処理区分を「queryout」とすることです。
出力結果は、「table_a.txt」とほぼ同じものが出力されます。
■テーブルにテキストファイルをインポートする
上記の説明で使用したテーブル「TABLE_A」にテキストファイル「table_c.txt」の内容をインポートする方法です。
C:\>bcp TEST.dbo.TABLE_A in "table_c.txt" -c -Slocalhost\SQLEXPRESS -T コピーを開始しています... 2 行コピーされました。 ネットワーク パケット サイズ (バイト): 4096 クロック タイム (ミリ秒) 合計 : 63 平均 : (31.75 行/秒)
テキストファイルの内容は、インポートされるテーブルの構造と同じである必要があります。
また、キーの重複があればエラーが発生し、全てのインポート処理は破棄されます。
C:\>bcp TEST.dbo.TABLE_A in "table_c.txt" -c -Slocalhost\SQLEXPRESS -T コピーを開始しています... SQLState = 23000, NativeError = 2627 Error = [Microsoft][SQL Native Client][SQL Server]制約 'PK_TABLE_A' の PRIMARY K EY 違反。オブジェクト 'dbo.TABLE_A' には重複したキーを挿入できません。 SQLState = 01000, NativeError = 3621 Warning = [Microsoft][SQL Native Client][SQL Server]ステートメントは終了されまし た。 BCP コピー in が失敗しました
=====
2013/02/12:の時の情報
PR -
前回のSQL-Serverの関数およびプロシージャの生成のバッチファイルでの実行方法の忘備録です。
ホストがローカルホストでインスタンス名がSQLEXPRESSでwindows認証の場合、 以下のコマンドを記述したバッチをサーバー上で実行します。
「test.bat」sqlcmd -S .\SQLEXPRESS -i ProcTest.sql sqlcmd -S .\SQLEXPRESS -i FuncTest.sql
「-S」:サーバーの接続先
「-i」:入力ファイルの指定
(この例ではバッチファイルとSQLファイルは同じフォルダに在ります。)
バッチの実行結果です。C:\test>sqlcmd -S .\SQLEXPRESS -i ProcTest.sql データベース コンテキストが 'TEST' に変更されました。 C:\test>sqlcmd -S .\SQLEXPRESS -i FuncTest.sql データベース コンテキストが 'TEST' に変更されました。
「ProcTest.sql」USE [TEST] GO IF OBJECT_ID('dbo.ProcTest') IS NOT NULL DROP PROCEDURE [dbo].[ProcTest] GO ----------------------------------------- -- 階乗を計算する(プロシージャ) ----------------------------------------- CREATE PROCEDURE [dbo].[ProcTest] @SrcNumber DECIMAL --引数 ,@DesNumber DECIMAL OUTPUT --戻り値 AS BEGIN SET @DesNumber = 1 WHILE @SrcNumber > 0 BEGIN SET @DesNumber = @DesNumber * @SrcNumber SET @SrcNumber = @SrcNumber - 1 END END
「FuncTest.sql」USE [TEST] GO IF OBJECT_ID('dbo.FuncTest') IS NOT NULL DROP FUNCTION [dbo].[FuncTest] GO ----------------------------------------- -- 階乗を計算する(関数) ----------------------------------------- CREATE FUNCTION [dbo].[FuncTest]( @SrcNumber DECIMAL --引数 ) RETURNS DECIMAL BEGIN DECLARE @DesNumber DECIMAL SET @DesNumber = 1 WHILE @SrcNumber > 0 BEGIN SET @DesNumber = @DesNumber * @SrcNumber SET @SrcNumber = @SrcNumber - 1 END RETURN @DesNumber END
データベース名を「TEST」として実行しています。
尚、関数・プロシージャとも内容の変更が有った場合を想定して、DROP命令で最初に削除しています。
=====
2012/06/13:の時の情報
-
最近、VB.NETでのSQL-Serverの関数およびプロシージャの実行をやったのでその忘備録です。
先ず、簡単な関数およびプロシージャをSQL-Serverに登録します。
FUNCTION、PROCEDURE共に階乗の計算を行います。VB.NETからの実行例ですので、 結果が桁数を超えるなどの制限は取り敢えず考えていません。
以下がそれぞれの内容です。
----------------------------------------- -- 階乗を計算する(関数) ----------------------------------------- CREATE FUNCTION [dbo].[FuncTest]( @SrcNumber DECIMAL --引数 ) RETURNS DECIMAL BEGIN DECLARE @DesNumber DECIMAL SET @DesNumber = 1 WHILE @SrcNumber > 0 BEGIN SET @DesNumber = @DesNumber * @SrcNumber SET @SrcNumber = @SrcNumber - 1 END RETURN @DesNumber END ----------------------------------------- -- 階乗を計算する(プロシージャ) ----------------------------------------- CREATE PROCEDURE [dbo].[ProcTest] @SrcNumber DECIMAL --引数 ,@DesNumber DECIMAL OUTPUT --戻り値 AS BEGIN SET @DesNumber = 1 WHILE @SrcNumber > 0 BEGIN SET @DesNumber = @DesNumber * @SrcNumber SET @SrcNumber = @SrcNumber - 1 END END
VB.NETでの実行は以下の様になります。関数の実行および、プロシージャの実行を別の関数にしてあります。'関数の実行 Private Sub TestFunc() 'コネクション・接続文字列 Dim Con As New System.Data.SqlClient.SqlConnection( _ "Data Source=(local)\SQLEXPRESS;" & _ "Initial Catalog=TEST;Integrated Security=SSPI") Try 'コネクションオープン Con.Open() '取得関数SQL Dim SQL As String = "SELECT [dbo].[FuncTest](@SrcNumber)" 'SQLコマンド生成(コネクション指定) Dim sqlCommand As New System.Data.SqlClient.SqlCommand(SQL, Con) 'SQLコマンドへ引数設定 sqlCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@SrcNumber", 10)) 'SQLコマンド実行 Dim obj As Object = sqlCommand.ExecuteScalar Console.Write(CDec(obj)) Finally 'コネクション破棄 If Con.State <> System.Data.ConnectionState.Closed Then Con.Close() Con.Dispose() End If End Try End Sub 'プロシージャの実行 Private Sub TestProc() 'コネクション・接続文字列 Dim Con As New System.Data.SqlClient.SqlConnection( _ "Data Source=(local)\SQLEXPRESS;" & _ "Initial Catalog=TEST;Integrated Security=SSPI") Try 'コネクションオープン Con.Open() '取得関数SQL Dim SQL As String = "[dbo].[ProcTest]" 'SQLコマンド生成 Dim sqlCommand As New System.Data.SqlClient.SqlCommand(SQL, Con) 'ストアド・プロシージャ設定 sqlCommand.CommandType = System.Data.CommandType.StoredProcedure 'SQLコマンドへ第1引数設定(SrcNumber) sqlCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@SrcNumber", 10)) 'SQLコマンドへ第2引数設定(DesNumber:出力指定) Dim prmDesNumber As New System.Data.SqlClient.SqlParameter With prmDesNumber .ParameterName = "@DesNumber" 'パラメータ名 .DbType = Data.DbType.Decimal 'DBのデータ型 .Direction = System.Data.ParameterDirection.Output '出力 .Precision = 18 'DECIMAL(18,0) .Scale = 0 '(小数点以下指定) .Value = 0 '取り敢えず値をクリア End With sqlCommand.Parameters.Add(prmDesNumber) 'プロシージャ実行 sqlCommand.ExecuteNonQuery() '戻り値を表示 Console.Write(prmDesNumber.Value) Finally 'コネクション破棄 If Con.State <> System.Data.ConnectionState.Closed Then Con.Close() Con.Dispose() End If End Try End Sub
=====
2012/06/13:の時の情報
-
asp.netアプリをコーディング中に、
「エラー 2 CodeDom プロバイダ型 "Microsoft.VJSharp.VJSharpCodeProvider, VJSharpCodeProvider, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" を読み込めませんでした。」
というエラーが出て、コンパイル不能状態に陥りました。
開発中の自分のディレクトリ内にJavaScript用のフォルダがあり その中にとあるライブラリを入れていたのですが、 その中に拡張子「java」のファイルがあったのが原因でした。
拡張子「java」のファイルを全て、別の拡張子に変更したらうまくいきました。
=====
2011/11/10:の時の情報
-
こんにちは。
昔「おやじプログラマー日記」というブログをやっていたのですが、
ここ数年、更新していなかったので、プロバイダから、削除されてしまいました。
そこで手元に残っている資料をもとに、少し復活していきます。
尚、何分古い情報ですので、参考になるかは、わかりませんが、
誰かの参考になれば幸いです。