Transact-SQLを使用したデータベース開発に役立つ13のヒント
http://japan.internet.com/developer/20050913/26.html
■OracleのNVLと似たような方法で 0へ置き換える記述です。行が返ってくる場合であれば、nullを0へ置き換られる。数値であれば、置換えた数値でSQL内の記述で計算も行えました。
---------------------------------------------------------
【参考情報】
http://www.sqlpassj.org/dbe/kaihatsu/06.aspx
OracleではNULLを置き換えるときにはNVL関数を使います。
SELECT NVL(顧客名,'NULLです') FROM 顧客
-----------------------------------------
山田里絵
NULLです
SQL Serverでは、以下のようにISNULL関数を使って記述します。
SELECT ISNULL(顧客名,'NULLです') FROM 顧客
-----------------------------------------
山田里絵
NULLです
SQL Serverでは、NULL以外にも、CASE文を使って、さらなる
置き換えができます。以下のSQLでは、顧客テーブルの顧客区分の
値を具体的な名称に置き換えています。
SELECT
case 顧客区分
when '1' then '通常顧客'
when '2' then '得意客'
when '3' then '要注意客'
when null then '区分なし'
else 'その他' end
from 顧客
顧客区分が'1'なら'通常顧客'、'2'なら'得意客'、'3'なら'要注意客'、
nullなら'区分なし'、それ以外は'その他'に置き換えています。
case文は現場で大活躍するので、ぜひ覚えておきましょう。
SQLの基礎「SELECT」文を覚えよう
http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html
逆引きSQL
http://homepage1.nifty.com/kojama/works/rdbms/ssa.html
非常にためになるSQLの例 さまざまなRDMSの比較も有り
http://homepage1.nifty.com/kojama/works/rdbms/mssql/misc.html
MS Access/SQLServer/Oracle最新リンク2005
http://www2.famille.ne.jp/~akio1998/l_x106.html
■BCPを使用し、カンマ区切りの形式でファイルを出力する(クエリアナライザーで実行)
bcp [database_name].dbo.実績CSV out D:\実績.CSV -T -c -t ","
bcp "[database_name].dbo.販売実績" out "D:\実績.txt" -T -c ←TAB区切り
■BULK INSERTを使用し、カンマ区切りのCSVファイルをインサートする(コマンドプロンプトで実行)
BULK INSERT 実績.CSV FROM "D:\実績.CSV" With (FIELDTERMINATOR = ',')
BULK INSERT 販売実績 FROM "D:実績.txt" ←TAB区切り
【参考情報】
件名:テキストデータの一括書き込みを行うには
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21554&forum=26&5
SQLServerのテーブルをVBAでエクスポート。でもクォートがつかない
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=29704&forum=26&8
2. データ転送ツールとしての DTS
http://tipsofvb.net/blogs/tips/archive/2005/06/28/88.aspx
http://www.microsoft.com/japan/msdn/sqlserver/columns/dts/dts1.aspx
BulkInsertTask クラス
http://msdn2.microsoft.com/ja-jp/library/microsoft.sqlserver.dts.tasks.bulkinserttask.bulkinserttask.aspx
BULK INSERT (Transact-SQL) SQL Server 2005 Books Online
http://msdn2.microsoft.com/ja-jp/library/ms188365.aspx
bcpコマンドの説明サイト
http://www.systeminfinity.co.jp/sub/tech/doc/SQLServer_BCP/BCP1.html
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnsql7/htm/sql7dss4.asp
BULK INSERT では、プロセス間でデータを受け渡す必要がなくなるので、bcp の 2.5 倍のパフォーマンスが達成されます。
BULK INSERT lineitem from ‘e:\lineitem.tbl.1’
理想的には、物理的なプロセッサ 1 つについて 1 つの BULK INSERT を起動するといいでしょう。
たとえば、4 プロセッサ システムでは 4 つの BULK INSERT ステートメントを並列実行し、8 プロセッサ システムでは 8つの BULK INSERT ステートメントを並列実行します。次のコード サンプルは、複数のファイルを使って並列ロードを行っています。
FOR %i IN (1 2 3 4) DO
START isql -Usa -P -Q "BULK INSERT lineitem from lineitem.tbl.%I with (tablock)"
次のコード サンプルは、1 つのファイルを使って並列ロードを行っています。
START isql -Usa -P -Q"BULK INSERT lineitem_table from c:\data\lineitem.tbl"
-FIRSTROW 1 -LASTROW 500000
START isql -Usa -P -Q"BULK INSERT lineitem_table from c:\data\lineitem.tbl"
-FIRSTROW 500001 -LASTROW 1000000
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19533&forum=7
操作が完了する前にタイムアウト期間が…
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14240&forum=7
ロックタイムアウトはDBで発生する事で、SqlCommandの.CommandTimeoutは
コマンドの処理を呼び出し側で打ち切る事
SqlCommand scmd = null;
SqlDataReader sdr = null;
try{
scmd = new SqlCommand();
scmd.Connection = [コネクション取得処理];
scmd.CommandText = "SET LOCK_TIMEOUT 15000";
scmd.CommandTimeout = 20;
scmd.ExecuteNonQuery();
scmd.CommandText = "[SQL文]";
sdr = scmd.ExcecuteReader();
}
としまして、Number=1222のロックタイムアウトをキャッチすることが出来ました。
http://www7.big.or.jp/~pinball/discus/sqls/27657.html
tempdbのトランザクション
そこでSQL Server ログを参照したところ
「データベース 'tempdb' のログ ファイルはいっぱいです。
ログ領域を解放するには、データベースのトランザクション ログを
バックアップしてください。。」
というエラーがありましたので、tempdbのトランザクションログの
バックアップを取ることにしました。
クエリアナライザで
BACKUP LOG
[DB名称]
TO
DISK = N'バックアップファイル名(フルパス)'
WITH
INIT,
NOUNLOAD,
NAME = N'バックアップ名称',
NOSKIP,
STATS = 10,
NOFORMAT
こんなの試してみてはどうでしょう??
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9092&forum=7
件名:ado.net ループ時のinsertについて
ループをしながらあるテーブルへ書込みする時について教えて下さい。
下記の様にループ文を作成し,テーブルへデータ追加をしています。
ここまでは,特に問題ないのですが,その後,SELECT文で同じテーブルへ
SELECTをかけるとどうやら,つかんでいる様でタイムアウトで
おちてしまいます。どうやったら開放できるのでしょうか?
ちなみに,違うテーブルでSELECT文を発行するのはうまくいきます。
ExceptionのMessageは
タイムアウトに達しました。操作が完了する前にタイムアウト期間が
過ぎたか、またはサーバーが応答していません。です。
ちなみにSELECT文前のINSERTをコメントにすると問題なく
処理を行います。
★objConnectをクローズしてからDataReaderを取得したらどうなります?
せっかくtry~catchしていますが、例外が発生したとき、コネクションを
閉じる処理が通らないところにあります。
IDisposableインタフェースを実装するクラスは、ガベージコレクタが管理
しないリソースを使います。したがって、開発者が
「これ、もう要らない」と思った時点で必ずDisposeメソッドをコール
しなければなりません。
読込み時に排他制御の記述を行う必要があるかもしれない。考えられる対処方法をいろいろと試してみて、有効な方法を探すしかなさそう。
考えられる対処方法は、下記の2点
①読み込み時に READ UNCOMMITTED を指定する
SET TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED :SELECT時にロックがかからない
READ COMMITTED(既定) :SELECT時にロックがかかる
②データ追加、更新、削除の処理を行う際、明示的にコミットする。
★この件は、「READ UNCOMMITTED :SELECT時にロックがかからない 」により解決出来たと思われる。
【技術情報】
http://www.sqlpassj.org/dbe/keyword/07_01.aspx
読み取り一貫性
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32695&forum=26&start=8&13
SQLServer2000の排他ロックタイミングについて
http://www.techscore.com/tech/sql/11_03.html
11.6. トランザクションの定義
VB.net を使用した大量データバッチ処理で、だんだんと速度が遅くなる現象。調べていた中で、tempdbのlockinfoについての似たような情報が有った。しかし、この件と速度低下が関係しているかどうかは不明。
http://www.webservertalk.com/archive132-2005-7-1149154.html
have a problem on my sql server, It's very slow, and some simple query have a long time execution.
I look on EM->management->Current Activity->Locks object, and I look for a strange lock on temp.dbo.##lockinfo54
TAB/X/GRANT/Xact/##lockinfo54 on right click -> "dbcc inputbuffer(54)"
自動的に拡張されたトランザクションの物理的なファイルサイズは、EnterpriseManager等のGUIでは圧縮することが出来ない。しかし、DBCCコマンドにて行える。
※データベースに「シンプル」の設定をしている際は、SQL Server6.5の時と同様、トランザクションログが切り詰められるが、「フル」の場合はトランザクションログのバックアップを実行をするまで増加し続ける。
http://support.microsoft.com/kb/272318?spid=2852&sid=global
DBCC SHRINKFILE を実行すると、SQL Server 2000 はいくつかの仮想ログ ファイルを目的のサイズに到達するまで削除し、ログ ファイルを圧縮します。もし、目的のサイズに到達できない場合は、ダミーのログ エントリーを、ログがログ ファイルの先頭に来るまで最後尾の仮想ログ ファイルに書き込んでいきます。この場合、ログを圧縮するには、以下の追加操作が必要になります。
1. BACKUP LOG コマンドを実行し、ログの非アクティブ部分を削除する。
2. 再び DBCC SHRINKFILE を目的の圧縮サイズを指定して実行する。
--------------------------------------------------------------
次の例は、pubs データベースのログ ファイルを 2MB に圧縮する例です。
1. 次のコマンドを実行 DBCC SHRINKFILE(pubs_log, 2)
注意: もしターゲットサイズに到達しなかった場合は、次のステップを実行します。
2. 次のコマンドを実行 BACKUP LOG pubs WITH TRUNCATE_ONLY
3. 次のコマンドを実行 DBCC SHRINKFILE(pubs_log,2)
--------------------------------------------------------------
以上の操作により、トランザクションログは目的のサイズに圧縮される。