ラベル SQL の投稿を表示しています。 すべての投稿を表示
ラベル SQL の投稿を表示しています。 すべての投稿を表示

2012年6月1日金曜日

(SQL Server)エラーメッセージ一覧

SQL Server エラーメッセージ一覧の取得方法です。取得には sys.messages カタログビュー(システム定義メッセージとユーザー定義メッセージ)を参照します。

language_id を指定しないと英語など、全ての言語のメッセージ一覧が取得できます。
SELECT *
FROM sys.messages

language_id を指定すると、指定した言語のメッセージ一覧が取得できます。
SELECT *
FROM sys.messages
WHERE language_id = 1041

さらに message_id を指定すると対象のメッセージ内容を取得できます。
SELECT *
FROM sys.messages
WHERE language_id = 1041
  AND message_id = 2627

.NET でアプリを開発している場合は try - catch で SqlException をキャッチして message_id に応じた例外処理も可能です。
try
{
    // 処理
}
catch (SqlException ex)
{
    if (ex.Number == 2627)
    {
        // キー重複
    }
}

■参考リンク
sys.messages (Transact-SQL) - MSDN

■環境
OS:Microsoft Windows XP Home Edition 日本語 ServicePack 3
DB:Microsoft SQL Server 2005 Express Edition Service Pack 4 (9.00.5000.00)
DB管理ツール:Microsoft SQL Server Management Studio Express (9.00.3042.00)

2012年5月21日月曜日

(SQL Server)テーブル存在チェック

テーブルの存在チェックです。OBJECT_ID という、メタデータ関数を使用します。

テーブルが存在すれば OBJECT ID を返し、存在しなければ NULL を返します。一部を除いてテーブル以外のオブジェクトも指定できます。
SELECT OBJECT_ID('データベース.スキーマ.テーブル')

カウントで存在チェックしてみたり
SELECT COUNT(*) FROM sys.objects WHERE object_id = OBJECT_ID('dbo.Table')

SQL Server 2000 なら
SELECT COUNT(*) FROM dbo.sysobjects WHERE id = OBJECT_ID('dbo.Table')
dbo.sysobjects は SQL Server 2005 以降でも使用できますが、将来のバージョンで削除される予定です。SQL Server 2005 以降を使っているなら、システムカタログビューの sys.objects 推奨です。詳しくは MSDN の SQL Server 『互換性ビュー』を参照してください。

■環境
OS:Microsoft Windows XP Home Edition 日本語 ServicePack 3
DB:Microsoft SQL Server 2005 Express Edition Service Pack 4 (9.00.5000.00)
DB管理ツール:Microsoft SQL Server Management Studio Express (9.00.3042.00)

2011年9月4日日曜日

(SQL Server)CASE 式 (IIf の代用としても)

SQL Server で条件評価を行う式です。Access IIf の代用としても使えます。

Access IIf の代用
IIf(fieldABC='A','Aです','Aではありません')

--この IIf を CASE に置き換える
CASE fieldABC WHEN 'A' THEN 'Aです' ELSE 'Aではありません' END
--または
CASE WHEN fieldABC = 'A' THEN 'Aです' ELSE 'Aではありません' END

--NULL 判定は
CASE WHEN fieldABC IS NULL THEN 'NULLです' ELSE 'NULLではありません' END
--CASE式とは関係ありませんが ISNULL という便利な関数もあります
ISNULL(fieldABC, 'NULLです')

単純 CASE 式
SELECT
 CASE fieldABC
  WHEN 'A' THEN 'Aです'
  WHEN 'AB' THEN 'ABです'
  ELSE '見つかりませんでした' -- 省略可能,省略時は NULL が返る
 END

検索 CASE 式
SELECT
 CASE
  WHEN fieldN < 100 THEN '100未満'
  WHEN fieldN >= 100 AND fieldN < 1000 THEN '100以上1000未満'
  ELSE '1000以上' -- 省略可能,省略時は NULL が返る
 END

■環境
OS:Microsoft Windows XP Home Edition 日本語 ServicePack 3
DB:Microsoft SQL Server 2005 Express Edition Service Pack 2 (9.00.3080.00)
DB管理ツール:Microsoft SQL Server Management Studio Express (9.00.3042.00)

■関連投稿
SQL Server での切り捨て
SQL Server での四捨五入

2011年2月3日木曜日

(SQL Server)四捨五入

SQL Server で四捨五入を行う関数です。

ROUND
SELECT ROUND(145.50, 0);
SELECT ROUND(145.45, 0);
SELECT ROUND(-145.50, 0);
SELECT ROUND(-145.45, 0);

SELECT ROUND(145.45, 1);
SELECT ROUND(145.45, 2);
SELECT ROUND(145.45, -1);
SELECT ROUND(145.45, -2);
結果
146.00
145.00
-146.00
-145.00

145.50
145.45
150.00
100.00
第2パラメータで四捨五入を行う位置を指定します。第2パラメータをマイナス指定すると小数点から左側で四捨五入を行います。他に切り捨ても行えます。

■環境
OS:Microsoft Windows XP Home Edition 日本語 ServicePack 3
DB:Microsoft SQL Server 2005 Express Edition Service Pack 2 (9.00.3080.00)
DB管理ツール:Microsoft SQL Server Management Studio Express (9.00.3042.00)

■関連投稿
SQL Server での切り捨て
SQL Server での四捨五入

(SQL Server)切り捨て

SQL Server で切り捨てを行う関数です。

--2016.10.25追記
TRUNC 関数が使用できる環境の場合は TRUNC を使用した方が良いです。

ROUND
SELECT ROUND(145.45, 0, 1);
SELECT ROUND(-145.45, 0, 1);
結果
145.00
-145.00
ROUND は四捨五入を行う関数ですが、第3パラメータに0以外の値を指定すると切り捨てが行えます。処理する値が正や負に関係なく、第2パラメータで指定された少数点以下で切り捨てられます。第2パラメータをマイナス指定すると小数点から左側で切り捨てが行えます。





他に CEILING (天井)と FLOOR (床)でも切り捨ては行えますが、処理する値が正か負で結果が変わります。引数以上で最小の整数(天井)を返すか、引数以下で最大の整数(床)を返すか、という事になっています。通常は ROUND で足りると思います。

CEILING
SELECT CEILING(145.45);
SELECT CEILING(-145.45);
結果
146.00
-145.00

FLOOR
SELECT FLOOR(145.45);
SELECT FLOOR(-145.45);
結果
145.00
-146.00

■環境
OS:Microsoft Windows XP Home Edition 日本語 ServicePack 3
DB:Microsoft SQL Server 2005 Express Edition Service Pack 2 (9.00.3080.00)
DB管理ツール:Microsoft SQL Server Management Studio Express (9.00.3042.00)

■関連投稿
SQL Server での切り捨て
SQL Server での四捨五入