SQL Server 2000 でストアドプロシージャのお勉強
情報サイト
PASSJ SQL Server ユーザーグループ
ソフト
SQL Server 2000 Developer
Microsoft SQL Server 2005 Developer Edition 日本語版
参考書
SQL Server 2000 ストアドプロシージャプログラミング ※第三章でもたもたしてますが(飽きた)ストアド書く時は必要になりそう。
SQL Server 2000 でいってみよう 管理者必須アイテム。手に入れましょう。
現場で使えるSQL ストアドの書き方は理解しやすいかも。ストアドプロシージャプログラミングとセットで。
アーキテクチャ徹底解説Microsoft SQL Server 2000 技術者向け。
ひと目でわかるMicrosoft SQL Server 2005 そろそろ基本操作を覚えておく…
※リンク先はamazon
サーバーカーソルを開いてクライアントでカーソル操作を行っている場合にストアドプロシージャに置き換えると
カーソル操作のオーバーヘッドがなくなる分、劇的(数百倍とか)に高速化されます。
データベース友の会
第1回 SQL Server勉強会 http://dbtk.main.jp/eventdetail018.php
日時 2010/11/6(土)、13:00〜18:00
内容 「いちから勉強。SQL Serverの基本構成 / データ書き込み / バックアップの動作について」
「SQL Serverのメモリ空間を考えてみる」
「データ移行のテクニックいろいろ」
パッチとか。
Microsoft SQL Server 2000 管理パック ガイド
SQL Server 2000 セキュリティ ツール
SQL Server 2000 デモキット:Enterprise Manager 編
SQL Server の修正プログラム インストーラ
SQL Server 2000 Service Pack 2 (日本語) JPN_SQL2KSP2.exe
Microsoft Analysis Server Service Pack 2 JPN_SQL2KASP2.exe
Microsoft SQL Server 2000 Service Pack 3a jpn_sql2ksp3.exe
Microsoft Analysis Server Service Pack 3a jpn_sql2kasp3.exe
Microsoft SQL Server 2000 Service Pack 4 SQL2000-KB884525-SP4-x86-JPN.EXE
Microsoft Analysis Server Service Pack 4 SQL2000.AS-KB884525-SP4-x86-JPN.EXE
Fix: Not All Memory is Available When AWE is Enabled on a Computer Running 32-bit Version of SQL Server 2000 SP4 (899761)
Cumulative Hotfix for SQL Server 2000 Service Pack 4 - Build 2162 for x86 and x64 Based Systems (日本語) SQL2000-KB904660-v8.00.2162-x86x64-JPN.exe
Microsoft SQL Server 2000 のセキュリティ 2000securityWP.doc (Microsoft Word 2000)
Best Practices Analyzer Tool for Microsoft SQL Server 2000 1.0
米Microsoft,「Yukon」の新機能と「SQL Server 2000」用ツールを紹介 http://itpro.nikkeibp.co.jp/free/ITPro/USNEWS/20031113/12/
SQL Server 2005 Service Pack 1
SQL Server 2005 ダウンロード
SQL Server 2005 SP2 RTM
修正一覧
SQL Server における JIS2004 対応について寄せられる質問と回答
SQL Server 2005 Service Pack 2 の累積的な更新プログラム パッケージ 4 について
Microsoft SQL Server 2005 Service Pack 3
SQL Server 2005 Service Pack 3 の累積的な更新プログラム パッケージ 1 について
SQL Server 2005 の最新の Service Pack を入手する方法
ここまで使えるSQL Server Express Edition
SQL Server 2008 Express
Microsoft® SQL Server® 2008 Express with Tools
Microsoft SQL Server 2008 オンライン ブック
Microsoft SQL Server 2008 用 Feature Pack - 2008 年 8 月
SQL Server 2008 の累積的な更新プログラム パッケージ 1 について
SQL Server 2008 Service Pack 1 ダウンロード
[FIX] MSXML Core Services 6.0 用のセキュリティ更新プログラム パッケージ 954459 をインストールした場合、SQL Server 2008 のセットアップが失敗する
SQL Server 2008 のスリップストリーム インストールが失敗する
SQL Server 2008 R2 概要
SQL Server のバージョンとエディションを識別する方法
Windows XP および Windows Server 2003 向けJIS2004 対応 MS ゴシック & MS 明朝フォントパッケージについて
CodePlex - SQL Server Hosting Toolkit
Microsoft SQL Server Management Studio Express
2007 年 6 月更新の SQL Server 2000 Books Online
SQL Server 2005 Express Edition
SQL文をGUIで作成できるフリーのデータベース開発環境「黒猫 SQL Studio」
SQL文の入力支援やER図作成に優れた高機能なSQL開発環境「A5:SQL Mk-2」
マイクロソフト、「MySQL」から「SQL Server」への移行ツールを公開
SQL Azureの機能と制約を理解する
Windows Azureのセキュリティホワイトペーパーを公開
最新Azure開発ツールの日本語版が公開 2010年7月第1週の更新情報
技術情報 | SQL Server 2008 R2
SQL Server 2000 にバッファオバーフローの脆弱性が見つかったようです。
mssql-sqldmo-bo (36509) Microsoft SQL Server sqldmo.dll ActiveX buffer overflow
http://xforce.iss.net/xforce/xfdb/36509
CLSID {10020200-E260-11CF-AE68-00AA004A34D5}
Internet Explorer で ActiveX コントロールの動作を停止する方法
http://support.microsoft.com/kb/240797
Jet エンジンにも脆弱性が見つかったようです。攻略コードも公開されてますねぇ…
microsoft-jet-engine-mdb-bo (38499) Microsoft Jet Engine MDB file buffer overflow
http://xforce.iss.net/xforce/xfdb/38499
Microsoft Jet Engine Stack Overflow May Let Remote Users Execute Arbitrary Code
http://www.securitytracker.com/alerts/2007/Nov/1018976.html
マイクロソフト セキュリティ情報 MS08-028 - 緊急
Microsoft Jet Database Engine の脆弱性により、リモートでコードが実行される (950749)
http://www.microsoft.com/japan/technet/security/bulletin/ms08-028.mspx
2008 Server, 2003 Server SP2, VISTA SP1, XP SP3 でこっそり修正してたようです。。。
Jet 関連
Microsoft Data Access Components 2.8 がインストールされるコンピュータに
SQL Server 2005 データベースからアプリケーションが ID 列の不正の値を受け取ります。
http://support.microsoft.com/kb/940569
Windows XP SP2/Windows Server 2003 SP1,SP2/Windows Vista
Jet 4.0 Database Engine hotfix package の説明(2007年8月23日)
http://support.microsoft.com/kb/943509
MDACを新バージョンにアップグレードする方法
http://www.atmarkit.co.jp/fwin2k/win2ktips/912mdacupg/mdacupg.html
Microsoft Jet 4.0 データベース エンジン用の最新の Service Pack の入手方法
http://support.microsoft.com/kb/239114/
New MS SQL Server vulnerability
http://isc.sans.org/diary.html?storyid=5485&rss
SQL Server2000、2005 の脆弱性に対しても攻略コードが出ているそうです。
アドバイザリ出ました。http://www.microsoft.com/japan/technet/security/advisory/961040.mspx
SQLインジェクション攻撃急増,「1日当たりに従来の1カ月分の攻撃を観測」
http://itpro.nikkeibp.co.jp/article/NEWS/20081222/321910/
SQL Server 2005の更新で 737d エラーが出た場合の対処
Remote Registry サービスを開始 > SC start RemoteRegistry
XP:プログラムの追加と削除、Vista以降:プログラムと機能から「Microsoft SQL Server 2005」を探して選択。
その後 [変更] または [アンインストールと変更] を選択し、未完了状態のセットアップを完了させる。
※間違ってアンインストールしない様に注意。
SQL Server 2005の更新プログラムで 737d エラーが出てしまう時の対処方法
http://blogs.technet.com/jpsecurity/archive/2009/10/19/3287612.aspx
Windows Update を使用して更新プログラムをインストールすると、エラー コード "737D" が表示される
http://support.microsoft.com/kb/977268/ja KB955
SQL Server 2008 のセットアップ時でインストールの最後に失敗する場合の対処法(例 x86用)
1. SQL Server 2008 SP1 を MS サイトからダウンロードしてくる。
2.ダウンロード後にファイルを展開 c:\>SQLServer2008SP1-KB968369-x86-JPN.exe /x:c:\SQL2008SP1
3.展開したファイルから sqlsupport.msi を実行。 c:\>SQL2008SP1\sp1\x86\setup\1041\sqlsupport.msi
4.再セットアップをコマンドから実行。 c:\>d:\setup.exe /PCUSource=c:\SQL2008SP1
SQL Server 2008 のインストールを更新またはスリップストリームする方法
http://support.microsoft.com/kb/955392/ja
Hyper-V 上のゲストにインストールした場合で、時刻同期が怪しくなる場合は
「SQL Server 構成マネージャ」を開いて「SQL Server のサービス」で
「SQL Server (MSSQLSERVER)」の「プロパティ(R)」を選択し、「詳細設定」タブを選択
「起動時のパラメータ」の末尾に「;-T8038」を追加後、再起動。
[FIX、SQL Server データベース エンジンと SQL Server レポート サービス予想以上の Windows クライアント コンピューター上の多くの電力が消費されることがあります。
http://support.microsoft.com/kb/972767/
第 2 回 SQL インジェクション その攻撃と対処
http://download.microsoft.com/download/4/2/4/424c5178-40ed-48fc-8b2c-690f99f1171e/Security_L100SQLINJECTION_2.ppt
SQL Server 2005 Books Online : SQL インジェクション
http://msdn2.microsoft.com/ja-jp/library/ms161953.aspx
How To: ASP.NET で SQL 注入(インジェクション)から保護する方法
http://www.microsoft.com/japan/msdn/enterprise/pag/securityguidance/paght000002.aspx
コード レビュー : SQL インジェクション
http://msdn.microsoft.com/ja-jp/library/cc402232.aspx
「安全なSQLの呼び出し方」を公開
http://www.ipa.go.jp/security/vuln/press/201003_websecurity_sql.html
【CSL】CSL緊急注意喚起レポート
〜新手のSQLインジェクションを行使するボットの確認〜
http://www.lac.co.jp/info/rrics_report/csl20081002.html
国内向けのサービスなら鎖国しちゃえば良いんですよ。(プロクシー経由や IPv6 になると防げませんけども。あと Bot も。)
地域レジストリ
アジア太平洋地域 APNIC(Asia Pacific Network Information Centre)
日本に割り振られているIP一覧
その他の地域はメモの方に
「今までにないタイプのSQLインジェクション」――ゴルフダイジェストへの不正アクセス手口が判明
http://itpro.nikkeibp.co.jp/article/NEWS/20081006/316229/
アンチウイルス製品にはロシアのカスペルスキーを進めているようですね。某有名3製品では検出しても駆除出来ない事が多いですからねぇ…
多数のWebサイトがハッキング被害に、大規模攻撃の再来か
http://www.itmedia.co.jp/enterprise/articles/0811/10/news006.html
またまた進化したSQLインジェクションの脅威 クッキーを悪用
http://it.nikkei.co.jp/security/column/nishimoto_security.aspx?n=MMIT2g000028102008&cp=1
DB を使っている場合に Request("n") で受け取るような書き方がありえない…(そんなコード書いてる会社に製作依頼してるならリスクが高いですね)
修正が困難なら IIS に UrlScan3.1 入れましょう。
セキュアシステム開発ガイドライン
http://www.jnsa.org/active/houkoku/web_system.pdf
脆弱なWebアプリケーション
http://www.thinkit.co.jp/free/tech/7/1/1.html
IPA、SQLインジェクション検出ツールを機能強化
http://internet.watch.impress.co.jp/cda/news/2008/11/11/21475.html
↑本番環境でいきなりやって DB 壊さないように…
相変わらずSQLサーバーを狙うワーム「Spybot」
http://itpro.nikkeibp.co.jp/article/COLUMN/20090406/327832/
※Windows 2000 のサポートが 2010年7月で終了となります。
[MS09-048]Windows TCP/IPの脆弱性により、リモートでコードが実行される (967723)
では、互換性の問題からパッチが2000用にはリリースされませんし
Windwos 2000 + SQL Server 2000 の構成マシンは見直し時期かも。
実録・4大データベースへの直接攻撃
http://www.atmarkit.co.jp/fsecurity/column/kawaguchi/025.html
SQL Server産みの親が語る、SQL ServerからCloudDB、SQL Azureへの歴史
http://cloud.watch.impress.co.jp/docs/event/20110304_430613.html
SQL Server に付属している管理ツール
・サービスマネージャ
・Enterprise Manager
・クエリアナライザ
【ステップ実行(デバッグ方法)】
ツールメニュー
オブジェクトブラウザ
データベース
ストアドプロシージャ
目的のストアドを右クリック
デバッグ
・DTSインポート/エクスポート
・osql
・isql
コマンドラインツール
クエリアナライザなどのGUIが利用可能になった今では滅多に使うことは無い。
・SQLプロファイラ
特定のユーザアプリケーションのアクティビリティ、ログイン操作、障害、エラー、トランザクションなどのキャプチャが出来る
システムパフォーマンスの改善に利用される
・クライアントネットワークユーティリティ
・名前付きパイプ
・TCP/IP
・マルチプロトコル
・NWLink IPX/SPX
・Banyan VINES
・共有メモリプロトコル
それぞれのプロトコルに対してサーバ毎に使用するネットワークライブラリを指定する事が出来る。
サービスマネージャ
・MS SQL Server
RDBMS は MS SQL Serverサービスとして実装されている。
・SQL Server Agent
スケジューリングされたタスクの実行を管理したり、サーバで発生した問題を管理者に通知したりする自動化サービス
・MSDTC(Microsoft Distributed Transaction Coordinator:分散トランザクションコーディネータ)
複数のサーバにまたがったトランザクションを、2フェーズコミットを使って管理するサービス
・SQL Mail と SQL Agent Mail
電子メールの送受信に使用されるサービス
メールを使って要求を受け取ったり、結果セットを返したりするタスクを実行し、スケジューリングされたタスクが正常に実行されたというステータスや発生したエラーを管理者に通知する事が出来る。
とりあえず何か動かしてみる。
クエリアナライザを起動して
EXEC SP_WHO2
このストアドプロシージャは、現在のサーバ上でアクティブなプロセスと、プロシージャを実行したログイン名の一覧を表示する。
新規ストアドプロシージャを作成してみる。
Enterprise Manager を起動して、ストアドプロシージャ から 新規ストアドプロシージャを選択。
CREATE PROCEDURE [OWNER].[PROCEDURE NAME] AS
が表示されるので
create procedure procHelloWorld1 As
select 'Hello World',
@@version,
@@servername as server
として、保存
クエリアナライザを起動して
exec procHelloWorld1
これを実行すると、Hello World のメッセージと、SQLのバージョン、サーバ名を表示する。
編集は、、、
ALTER PROCEDURE を使う。
alter procedure procHelloWorld1 As
select 'Hello World',
@@version,
@@servername as server
return 0
go
このコマンドにより、ストアドプロシージャに関連付けされた属性(権限)などが影響を受ける事無く変更が可能。
また、Enterprise Manager の ツール>ウイザードからデータベースをクリックすると、データベースオブジェクトの作成ウィザードの一覧が表示されます。
このウィザードを使って、テーブルに対する挿入、削除、更新の操作を実行する為の単純なプロシージャが作成可能です。
作成したプロシージャの削除
DROP PROCEDURE
DROP PROCEDURE procHelloWorld1
で、削除される。
作成
CREATE PROC[EDURE] <プロシージャ名>
[{@<パラメータ> <データ型>} [=default] [OUTPUT] ] [, ...}
AS
<SQL ステートメント> [ ...]
削除
DROP PROC[EDURE] <プロシージャ名>
GO
更新
ALTER PROC[EDURE] <プロシージャ名>
[{@<パラメータ> <データ型>} [=default] [OUTPUT] ] [, ...}
AS
<SQL ステートメント> [ ...]
制限事項
・ストアドプロシージャの名前は 128 文字まで
・最大 1024 の入力/出力パラメータを指定可能
・128M まで記述可能
データ型
文字列型
char varchar, text
Unicode 文字列型
nchar nvarchar ntext
日付時刻型
datetime smalldatetime
整数型
int smallint tinyint bigint bit
近似値型
real float
数値型
decimal numeric
通貨型
money smallmoney
バイナリ型
binary varbinary image
特殊型
timestamp uniqueidentifier sql_variant cursor table
char 最大8000文字まで格納可能。文字列の後ろにスペースが付いて格納される。
varchar 最大8000文字まで格納可能。そのまま格納される。(文字列の長さを記録する為に2バイトが追加で使用される)
text 最大2GBを格納可能。
nchar 1文字を2バイトで表す Unicode で格納される。格納できる最大文字数は半分になる。
nvarchar
ntext
datetime 8バイト使用(精度は3.33msで1753.1.1-9999.12.31までの期間をカバー)
smalldatetime 4バイト使用(精度は1分で1900.1.1-2079.6.6までの期間をカバー)
※ 定数に時刻を指定しなかった場合、既定で午前00時00分がセットされる。
int 4バイト -2147483648 〜 2147483647 まで
smallint 2バイト -32768 〜 32767 まで
tinyint 1バイト 0 〜 255 まで
bigint 8バイト -9223372036854775808 - 9223372036854775807 まで
bit 1ビット 0 〜 1 まで
real 単精度 最高7桁 234000000000 を 234E9 と指数表記。精度に劣る
float 倍精度 最高15桁
decimal 精度とスケールを割り当てる
numeric 123456.789 の数値は、精度9、スケール3 となる。
money 8バイト -922337203685477.5808 〜 922337203685477.5807 まで
smallmoney 4バイト -214768.3648 〜 214768.3647 まで
binary 最大8000バイトまで格納可能
varbinary 最大8000バイト格納可能
image 最大2GB格納可能
timestamp レコードのバージョン番号として使用される(8バイトのバイナリ)
uniqueidentifier(GUID) 16バイトのバイナリを格納
書式は文字列 '{A1952C19-C57A-422B-B3EA-03AC2A0934D4}' かバイナリ定数 0xaf16aa5687ab578ffc030c00546f40f2
新たに生成された GUID 値はそのコンピュータだけではなく、世界の全てのコンピュータにおいても再度生成される事は無い。
sql_variant VBの variant 型と同じ。 メタデータ(基本データ型、最大サイズ、スケール、精度、照合順序)
※ text, ntext, image, timestamp, sql_variant 型は格納出来ない。
-- 1行のコメント
/* … */ 複数行のコメントに利用
ヒント: SQL Server 2008 の 9 個の数値データ型を理解する
http://technet.microsoft.com/ja-jp/sqlserver/sql_tips14.aspx
ストアドを始めて触るって人は、@IT の記事等を参考にすると、ここから先も理解しやすいかと。
連載:SQL実践講座(20)
ストアドプロシージャの作成
http://www.atmarkit.co.jp/fnetwork/rensai/sql20/sql1.html
NULL値処理関数
NULLIF 指定された 2 つの式が等価な場合に NULL 値を返します。
ISNULL NULL 値を、指定された値に置き換えます。
COALESCE 引数の中から、最初の NULL でない式を返します。CASE 関数に相当
よく使いそうなグローバル関数
@@IDENTITY サーバにより自動的に生成された一意の値が格納される。insert後のオートナンバーフィールドを調べるのに使ったり。
@@ERROR コマンドの成功で0がセットされる。 insert や Update 後の調査に使ったり。
@@ROWCOUNT 影響を受けたレコードの数がセットされる。 1件更新するつもりが・・・って時や、レコード処理無しのチェックに。
@@TRANCOUNT
SELECT @@IDENTITY AS ID, @@ERROR AS ER, @@ROWCOUNT AS RCNT
----------------------------------------------------
--メモ
DECLARE @IntIDENT AS INT
DECLARE @IntErr AS INT
DECLARE @IntTrCnt AS INT
/*
SELECT
@IntIDENT = @@IDENTITY,
@IntErr = @@ERROR,
@IntTrCnt = @@TRANCOUNT
*/
SET @IntIDENT = @@IDENTITY --オートナンバ値
SET @IntErr = @@ERROR --エラー
SET @IntTrCnt = @@TRANCOUNT --トランザクション数
SELECT @IntIDENT, @IntErr, @IntTrCnt
----------------------------------------------------
月曜日の算出をしたい…
DATEPART ( datepart , date )
datepart
year, yy, yyyy
quarter, qq, q
month, mm, m
dayofyear, dy, y
day, dd, d
week, wk, ww
weekday, dw
日曜=1,土曜=7
※開始値の定義 DATEFIRST によって設定される週の始まりの値は異なる。
デフォルトは 7 がセットされている SELECT @@DATEFIRST で確認出来る。
hour, hh
minute, mi, n
second, ss, s
millisecond, ms
SELECT datepart(weekday,GetDate())
------------------------------------------------------
DATEADD ( datepart , number, date )
datepart
Year, yy, yyyy
quarter, qq, q
Month, mm, m
dayofyear, dy, y
Day, dd, d
Week, wk, ww
Hour, hh
minute, mi, n
second, ss, s
millisecond, ms
------------------------------------------------------
テスト
DECLARE @D AS DATETIME
SET @D = '2005/09/06 12:00:00' --テスト用に日付を定義
SET DATEFIRST 1 --日曜を1にセット(デフォルトは7)
SELECT DATEADD(Day,-1*(datepart(weekday,@D)-1),@D) AS MON
------------------------------------------------------
ストアド作成
CREATE PROCEDURE GetMon
@D Datetime
AS
SET DATEFIRST 1
SELECT DATEADD(Day,-1*(datepart(weekday,@D)-1),@D) AS MON
------------------------------------------------------
実行
EXEC GetMon '2005/09/07'
結果は 2005-09-05 00:00:00.000 となる。
------------------------------------------------------
日付以外の文字が来た場合の対応をしてみる。
テスト
DECLARE @strDATE AS VARCHAR(50),
@tmpDATE AS DATETIME
SET @strDATE = '2005/09/06 12:00:00' --適当な文字列を入れてチェック
IF ISDATE(@strDATE) = 0 --日付に変換出来ない場合は今日の日付を代入
SET @tmpDATE = GETDATE()
ELSE
Begin --1行の場合は BEGIN-END で括る必要は無い。
SET @tmpDATE = CONVERT(DATETIME, @strDATE)
End
SET DATEFIRST 1
SELECT DATEADD(Day,-1*(datepart(weekday, @tmpDATE)-1), @tmpDATE) AS MON
------------------------------------------------------
ストアド作成
DROP PROCEDURE GetMon --「GetMon」削除後に登録
Go
CREATE PROCEDURE GetMon
@strDATE AS VARCHAR(50) = '' --初期値もセット
AS
DECLARE @tmpDATE AS DATETIME
IF ISDATE(@strDATE) = 0
SET @tmpDATE = GETDATE()
ELSE
SET @tmpDATE = CONVERT(DATETIME, @strDATE)
SET DATEFIRST 1
SELECT DATEADD(Day,-1*(datepart(weekday,@tmpDATE)-1),@tmpDATE) AS MON
Go
------------------------------------------------------
--YYMMDD で結果を返すテスト
DECLARE @D AS DATETIME
SET @D = '2005/09/14 12:00:00'
SET DATEFIRST 1
SELECT @D=DATEADD(Day,-1*(datepart(weekday,@D)-1),@D)
SELECT CONVERT(varchar(4),Right(Year(@D),2))
+ Right('00' + CONVERT(varchar(2),Month(@D)),2)
+ Right('00' + CONVERT(varchar(2),Day(@D)),2) AS MON
------------------------------------------------------
出力パラメータと戻り値を追加してみる。
ストアド作成
--既に「GetMon」が登録されていた場合は削除
If Exists (SELECT * FROM sysobjects WHERE ID = objct_id('GetMon') AND OBJECTPROPERTY(ID, 'GetMon') = 1
DROP PROCEDURE GetMon
Go
CREATE PROCEDURE GetMon
@strDATE AS VARCHAR(50) = '', --初期値もセット
@outDATE AS VARCHAR(6) output
AS
DECLARE @tmpDATE AS DATETIME
IF ISDATE(@strDATE) = 0
SET @tmpDATE = GETDATE()
ELSE
SET @tmpDATE = CONVERT(DATETIME, @strDATE)
SET DATEFIRST 1
SET @tmpDATE = DATEADD(Day,-1*(datepart(weekday,@tmpDATE)-1),@tmpDATE)
SELECT @outDATE = CONVERT(varchar(4),Right(Year(@tmpDATE),2))
+ Right('00' + CONVERT(varchar(2),Month(@tmpDATE)),2)
+ Right('00' + CONVERT(varchar(2),Day(@tmpDATE)),2)
Return @@ERROR -- Returnで返す事が出来るのは整数値又は整数式のみ。
Go
------------------------------------------------------
呼び出してみる
Declare @outDATE VARCHAR(6),
@rtnCODE INT
EXEC @rtnCODE = GetMon @outDATE = @outDATE output
SELECT @outDATE 'DATE', @rtnCODE 'ERROR CODE'
結果は
DATE ERROR CODE
------ ----------
050919 0
となる。
------------------------------------------------------
SQL Server 2008,SQL Server 2008 Express では新しく
datetime 8バイト使用(精度は3.33msで1753.1.1-9999.12.31までの期間をカバー)
smalldatetime 4バイト使用(精度は1分で1900.1.1-2079.6.6までの期間をカバー)
から
date 3バイト使用 (0001/1/1 〜 9999/12/31)
time 3〜5バイト使用 (精度は100ns)
datetime2 6〜8バイト使用 (精度は100nsで0001.1.1-9999.12.31までの期間をカバー)
datetimeoffset 8〜10バイト使用 (精度は100nsで0001.1.1-9999.12.31までの期間をカバー)
が追加されているようです。
------------------------------------------------------
ASP から呼び出す。
Set DB = Server.CreateObject("ADODB.Connection")
DB.Open "Provider=SQLOLEDB.1;Data Source=localhost;Persist Security Info=False;Initial Catalog=データベース名;User ID='sa';Password='*'" '使用中の環境に合わせてデータベース接続文字列を設定
Set CMD = Server.CreateObject("ADODB.Command")
With CMD
Set .ActiveConnection = DB
.CommandText = "GetMon"
.CommandType = &H0004
.Parameters.Append = .CreateParameter("Res", 3, &H0004) '引数を先頭に書かないとエラーになる(戻り値は多くの場合、要素ゼロにある)
.Parameters.Append = .CreateParameter("strDATE", 200, &H0001, 50, "2005/09/21")
.Parameters.Append = .CreateParameter("outDATE", 200, &H0002, 6)
.Execute
Response.Write "ERROR: " & .Parameters.Item("res").Value & "<br>"
Response.Write "結果: " & .Parameters.Item("outDATE").Value & "<br>"
End With
実際の処理で使う場合は
CMD.Prepared = False
Set RS = CMD.Execute
Do While (Not RS Is Nothing)
'State
'0 adStateClosed 閉じている
'1 adStateOpen オープン
'2 adStateConnecting 接続中
'4 adStateExecuting 実行中
'8 adStateFetching 行を取得
If RS.State = 0 Then Exit Do
If RS.EOF Then
'何か処理
Else
While Not RS.EOF
'何か処理
RS.MoveNext
Loop
End If
Set RS = RS.NextRecordset
Loop
こんな感じで。
調べてませんが、RAISERROR および PRINT ステートメントも受け取れます。
この辺り http://support.microsoft.com/kb/194792/ja
ASPで Guest アカウントによる SQL の信頼関係接続を使用する方法
http://support.microsoft.com/kb/176380
SQL Server 2000 または SQL Server 2005 に接続するときに "SQL Server の信頼関係接続に関連付けられていません" というエラー メッセージが表示されることがある
http://support.microsoft.com/kb/889615
ASP から SQL Server のストアド プロシージャを呼び出す方法
http://support.microsoft.com/kb/164485
[HOWTO] ストアド プロシージャに関するパラメータ要件を ASP で確認する方法
http://support.microsoft.com/kb/165156
ADO で SQL Server のストアド プロシージャの値を取得する方法
http://support.microsoft.com/kb/194792
Microsoft SQL Serverのストアド プロシージャとパラメータをやりとりするためにVisual InterDevを使う
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnvid/htm/VintrDev/VISQL/visql.asp
ついで
■今月末の日付を出力
SELECT DATEADD(DAY, -1, CONVERT(DATETIME, (CONVERT(CHAR(7), DATEADD(MONTH, 1, GETDATE()) , 111) + '/1'))) '今月末'
■月末までの残り
SELECT DATEDIFF(DAY, GETDATE(), DATEADD(DAY, -1, CONVERT(DATETIME,(CONVERT(CHAR(7), DATEADD(MONTH, 1, GETDATE()), 111) + '/1')))) '月末までの残日数'
0 mon dd yyyy hh:miAM (または PM)
1 mm/dd/yy
2 yy.mm.dd
3 dd/mm/yy
4 dd.mm.yy
5 dd-mm-yy
6 dd mon yy
7 Mon dd, yy
8 hh:mm:ss
9 mon dd yyyy hh:mi:ss:mmmAM(または PM)
10 mm-dd-yy
11 yy/mm/dd
12 yymmdd
13 dd mon yyyy hh:mm:ss:mmm(24 時間制)
14 hh:mi:ss:mmm (24 時間制)
20 yyyy-mm-dd hh:mi:ss(24 時間制)
21 yyyy-mm-dd hh:mi:ss.mmm(24 時間制)
※世紀を含む 4 桁の年(yyyy) を取得するには 100 を加える
詳しくは HELP の CAST と CONVERT 参照
------------------------------------------------------
ユーザ関数として作成
とりあえず、この辺りでも、、、
ユーザー定義関数を作成する ストアドファンクション
http://www.atmarkit.co.jp/fnetwork/rensai/sql23/sql1.html
呼び出し
SELECT dbo.GetMon('2006/06/03')
みたいな?
※小技
演算子の優先順位
( ) → 算術演算子(*,/,% → +,-) →文字列連結演算子 → 比較演算子 → 論理演算子 (NOT → AND → BETWEEN,EXISTS,IN,LIKE,OR)
------------------------------------------------------
SELECT 文を複数発行するようなストアドプロシージャの場合は
ストアドに、 SET NOCOUNT ON と記述してあげないと ASP から
呼び出せない場合があるようです。
「ストアド ASP オブジェクトが閉じている場合は、操作は許可されません」
と出る場合は多分そうでしょう。
PRB: ADO-SQLOLEDB での参照する#temp テーブル メッセージ エラー
http://support.microsoft.com/kb/235340/ja
また、 SET XACT_ABORT ON で、何かのエラーが起きた場合それ以降の処理を中断。(トランザクション全体をロールバック)
------------------------------------------------------
8,060 バイトを超えるレコードがある場合、GROUP BY、ORDER BY は利用できない。
SQL Server 7.0/2000 最大容量仕様
http://msdn.microsoft.com/library/ja/architec/8_ar_ts_8dbn.asp
SQL Server 2005 の最大容量仕様
http://msdn2.microsoft.com/ja-jp/library/ms143432(SQL.90).aspx
------------------------------------------------------
デッドロックの回避
SELECT 文 に NOLOCK を追加する。
SELECT * FROM HOGE WITH (NOLOCK) WHERE ID=1
※ NOLOCK はトランザクション上、整合性のある結果を返すことが保証されていないため、常に慎重に使用する必要があります。
SQL Serverで「デッドロック」を回避する
http://www.atmarkit.co.jp/fnetwork/rensai/sql28/sql1.html
SELECT を多用する場合は MAXDOP を 1 にすると、パフォーマンスが上がるらしい。
SQL Server 2005 の場合はトランザクション分離レベルを利用する。
NOLOCK の正しい使い方
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1303118&SiteID=7
利用できるテーブルヒント
http://msdn2.microsoft.com/ja-jp/library/ms187373.aspx
SQL Server 2005 Tips and Tips
第 2 回 排他ロックにブロックされない読み取りの実現
http://www.microsoft.com/japan/sql/ssj/tips/02.mspx
集中連載:SQL Server 2005 と Oracle 10g の真実
第 3 回 トランザクション分離レベル 〜 読み取り一貫性のサポートとロック エスカレーション 〜
http://www.microsoft.com/japan/sql/facts/compare/03.mspx
ALTER DATABASE データベース名 SET ALLOW_SNAPSHOT_ISOLATION ON
と設定しておいて
SELECT * FROM データベース名 WITH (SNAPSHOT)
かな?
SQL Server 2005 および SQL Server 2000 のブロッキングを監視する方法
http://support.microsoft.com/kb/271509
SQL Server 技術情報 - デッドロックの解決方法
http://support.microsoft.com/kb/832524
SQL Server でロックのエスカレーションが原因で発生するブロッキング問題を解決する
http://support.microsoft.com/kb/323630
SQL Server に新しく追加された同時実行およびスケジューリングの診断機能
http://support.microsoft.com/kb/319892
SQL Server 2000 の sysprocesses テーブル内の waittype 列および lastwaittype 列
http://support.microsoft.com/kb/822101
ロックオプション
粒度ヒント : PAGLOCK、NOLOCK、ROWLOCK、TABLOCK、TABLOCKX
分離レベル ヒント : HOLDLOCK、NOLOCK、READCOMMITTED、REPEATABLEREAD、SERIALIZABLE
SELECT * FROM データベース名 WITH (TABLOCK, HOLDLOCK)
こんな感じ。この例ではテーブルに対して HOLDLOCK を指定
ロック解除待ちをせずにすぐさまエラーにしたい場合は
SELECT * FROM データベース名 WITH (NOWAIT, TABLOCK, HOLDLOCK)
この辺りを参照
http://msdn.microsoft.com/ja-jp/library/ms187373.aspx
トランザクションの一貫性を保証するロック
http://www.atmarkit.co.jp/fnetwork/rensai/sql27/sql1.html
SQL Serverで「デッドロック」を回避する
http://www.atmarkit.co.jp/fnetwork/rensai/sql28/sql1.html
詳しくは、悲観ロックと楽観ロックで検索。
------------------------------------------------------
SQL インジェクション対策として QUOTENAME か REPLACE で2重化する。
QUOTENAME 関数の第二引数は、" ' ( ) < > [ ] ` { } が指定出来る。
DECLARE @tmpSQL nvarchar(100)
SET @tmpSQL = 'abc[]def'
PRINT QUOTENAME(@tmpSQL) --> [abc[]]def]
-- abc'def の場合
PRINT QUOTENAME(@tmpSQL,'''') --> 'abc''def'
SQL Injection対策
http://msdn2.microsoft.com/ja-jp/library/ms161953.aspx
http://vsug.jp/tabid/63/forumid/56/postid/537/view/topic/Default.aspx
------------------------------------------------------
文字列を SQL文として実行させるには sp_executesql を使う。
DECLARE @tmpSQL nvarchar(100)
SET @tmpSQL = N'SELECT * TEST'
EXEC sp_executesql @tmpSQL
------------------------------------------------------
「_」「%」「'」が含まれている文字列の検索
WHERE 商品マスタ LIKE '%\_%' ESCAPE '\'
WHERE 商品マスタ LIKE '%\%%' ESCAPE '\'
WHERE 商品マスタ LIKE '%''%'
構文
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
LIKEで扱われるワイルドカード文字
% 0 個またはそれ以上の文字で構成される任意の文字列
_ 任意の 1 文字
[ ] 指定した範囲 ([a-f]) またはセット ([abcdef]) 内にある任意の 1 文字
[^] 指定した範囲 ([^a-f]) またはセット ([^abcdef]) 内にない任意の 1 文字
半角カタカナの濁点が含まれている文字列の検索
WHERE 商品マスタ LIKE '%゙%' COLLATE Japanese_BIN
WHERE 商品マスタ LIKE '%゚%' COLLATE Japanese_BIN
日本語版の照合順序はJapanese_CI_AS と全角半角を無視する設定になっているので
区別させるには、COLLATE Japanese_BIN とする。(又は COLLATE Japanese_AS_CS_KS_WS)
Bug Details: Japanese_CI_ASなどで長音記号(ー)を検索できない
http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=c540b3c7-fce2-47cc-95e6-fd780172ebea
照合順序 http://www.microsoft.com/japan/technet/prodtechnol/sql/2000/books/c04ppcsq.mspx
CI 大文字、小文字を区別しない
CS 大文字、小文字を区別する
AI アクセントを区別しない
AS アクセントを区別する
KS カナタイプを区別する
WS 文字幅を区別する
BIN バイナリの並べ替え順
BIN2 バイナリの並べ替え順(SQL Server 2005 はこっちを利用)http://msdn2.microsoft.com/ja-jp/library/ms143350.aspx
並べ替え順 ID SQL 照合順序名
30 SQL_Latin1_General_Cp437_BIN バイナリ順、437 (英語 (U.S.)) 文字セットを使用。
31 SQL_Latin1_General_Cp437_CS_AS 辞書順、大文字小文字を区別する、437 (英語(U.S.)) 文字セットを使用。
32 SQL_Latin1_General_Cp437_CI_AS 辞書順、大文字小文字を区別しない、437 (英語(U.S.)) 文字セットを使用。
33 SQL_Latin1_General_Pref_CP437_CI_AS 辞書順、大文字小文字を区別しない、大文字優先、437 (英語(U.S.)) 文字セットを使用。
34 SQL_Latin1_General_Cp437_CI_AI 辞書順、大文字小文字を区別しない、アクセントを区別しない、437 (英語(U.S.)) 文字セットを使用。
40 SQL_Latin1_General_Cp850_BIN バイナリ順、850 (多言語) 文字セットを使用。
41 SQL_Latin1_General_Cp850_CS_AS 辞書順、大文字小文字を区別する、850 (多言語) 文字セットを使用。
42 SQL_Latin1_General_Cp850_CI_AS 辞書順、大文字小文字を区別しない、850 (多言語) 文字セットを使用。
43 SQL_Latin1_General_Pref_CP850_CI_AS 辞書順、大文字小文字を区別しない、大文字優先、850 (多言語) 文字セットを使用。
44 SQL_Latin1_General_Cp850_CI_AI 辞書順、大文字小文字を区別しない、アクセントを区別しない、850 (多言語) 文字セットを使用。
49 SQL_1Xcompat_CP850_CI_AS Version 1.x の大文字小文字を区別しないデータベースと完全に互換、850 (多言語) 文字セットを使用。
50 Latin1_General_BIN バイナリ順、1252 文字セットを使用。
51 SQL_Latin1_General_Cp1_CS_AS 辞書順、大文字小文字を区別する、1252 文字セットを使用。
52 SQL_Latin1_General_Cp1_CI_AS 辞書順、大文字小文字を区別しない、1252 文字セットを使用。
53 SQL_Latin1_General_Pref_CP1_CI_AS 辞書順、大文字小文字を区別しない、大文字優先、1252 文字セットを使用。
54 SQL_Latin1_General_Cp1_CI_AI 辞書順、大文字小文字を区別しない、アクセントを区別しない、1252 文字セットを使用。
55 SQL_AltDiction_Cp850_CS_AS 代替辞書順、大文字小文字を区別する、850 (多言語) 文字セットを使用。
56 SQL_AltDiction_Pref_CP850_CI_AS 代替辞書順、大文字小文字を区別しない、大文字優先、850 (多言語) 文字セットを使用。
57 SQL_AltDiction_Cp850_CI_AI 代替辞書順、大文字小文字を区別しない、アクセントを区別しない、850 (多言語) 文字セットを使用。
58 SQL_Scandinavian_Pref_Cp850_CI_AS スカンジナビア辞書順、大文字小文字を区別しない、大文字優先、850 (多言語) 文字セットを使用。
59 SQL_Scandinavian_Cp850_CS_AS スカンジナビア辞書順、大文字小文字を区別する、850 (多言語) 文字セットを使用。
60 SQL_Scandinavian_Cp850_CI_AS スカンジナビア辞書順、大文字小文字を区別しない、850 (多言語) 文字セットを使用。
61 SQL_AltDiction_Cp850_CI_AS 代替辞書順、大文字小文字を区別しない、850 (多言語) 文字セットを使用。
71 Latin1_General_CS_AS ラテン語 -1 大文字小文字を区別する、1252 文字セットを使用。
72 Latin1_General_CI_AS ラテン語 -1 大文字小文字を区別しない、1252 文字セットを使用。
73 Danish_Norwegian_CS_AS デンマーク/ノルウェー語辞書順、大文字小文字を区別する、コード ページ 1252 の並べ替え順。
74 Finnish_Swedish_CS_AS フィンランド/スウェーデン語辞書順、大文字小文字を区別する、コード ページ 1252 の並べ替え順。
75 Icelandic_CS_AS アイスランド辞書順、大文字小文字を区別する、コード ページ 1252 の並べ替え順。
80 Hungarian_BIN バイナリ順、1250 (中央ヨーロッパ語) 文字セットを使用。
(or Albanian_BIN, Czech_BIN, and so on)1
81 SQL_Latin1_General_Cp1250_CS_AS 辞書順、大文字小文字を区別する、1250 (中央ヨーロッパ語) 文字セットを使用。
82 SQL_Latin1_General_Cp1250_CI_AS 辞書順、大文字小文字を区別しない、1250 (中央ヨーロッパ語) 文字セットを使用。
83 SQL_Czech_Cp1250_CS_AS チェコ辞書順、大文字小文字を区別する、1250 (中央ヨーロッパ語) 文字セットを使用。
84 SQL_Czech_Cp1250_CI_AS チェコ辞書順、大文字小文字を区別しない、1250 (中央ヨーロッパ語) 文字セットを使用。
85 SQL_Hungarian_Cp1250_CS_AS ハンガリア辞書順、大文字小文字を区別する、1250 (中央ヨーロッパ語) 文字セットを使用。
86 SQL_Hungarian_Cp1250_CI_AS ハンガリア辞書順、大文字小文字を区別しない、1250 (中央ヨーロッパ語) 文字セットを使用。
87 SQL_Polish_Cp1250_CS_AS ポーランド辞書順、大文字小文字を区別する、1250 (中央ヨーロッパ語) 文字セットを使用。
88 SQL_Polish_Cp1250_CI_AS ポーランド辞書順、大文字小文字を区別しない、1250 (中央ヨーロッパ語) 文字セットを使用。
89 SQL_Romanian_Cp1250_CS_AS ルーマニア辞書順、大文字小文字を区別する、1250 (中央ヨーロッパ語) 文字セットを使用。
90 SQL_Romanian_Cp1250_CI_AS ルーマニア辞書順、大文字小文字を区別しない、1250 (中央ヨーロッパ語) 文字セットを使用。
91 SQL_Croatian_Cp1250_CS_AS クロアチア辞書順、大文字小文字を区別する、1250 (中央ヨーロッパ語) 文字セットを使用。
92 SQL_Croatian_Cp1250_CI_AS クロアチア辞書順、大文字小文字を区別しない、1250 (中央ヨーロッパ語) 文字セットを使用。
93 SQL_Slovak_Cp1250_CS_AS スロバキア辞書順、大文字小文字を区別する、1250 (中央ヨーロッパ語) 文字セットを使用。
94 SQL_Slovak_Cp1250_CI_AS スロバキア辞書順、大文字小文字を区別しない、1250 (中央ヨーロッパ語) 文字セットを使用。
95 SQL_Slovenian_Cp1250_CS_AS スロヴェニア辞書順、大文字小文字を区別する、1250 (中央ヨーロッパ語) 文字セットを使用。
96 SQL_Slovenian_Cp1250_CI_AS スロヴェニア辞書順、大文字小文字を区別しない、1250 (中央ヨーロッパ語) 文字セットを使用。
97 Windows ポーランド辞書順、大文字小文字を区別する、1250 文字セットを使用。
98 Windows ポーランド辞書順、大文字小文字を区別しない、1250 文字セットを使用。
104 Cyrillic_General_BIN バイナリ順、1251 (キリル文字) 文字セットを使用。
(or Ukrainian_BIN, Macedonian_BIN)
105 SQL_Latin1_General_Cp1251_CS_AS 辞書順、大文字小文字を区別する、1251 (キリル文字) 文字セットを使用。
106 SQL_Latin1_General_Cp1251_CI_AS 辞書順、大文字小文字を区別しない、1251 (キリル文字) 文字セットを使用。
107 SQL_Ukrainian_Cp1251_CS_AS ウクライナ辞書順、大文字小文字を区別する、1251 (キリル文字) 文字セットを使用。
108 SQL_Ukrainian_Cp1251_CI_AS ウクライナ辞書順、大文字小文字を区別しない、1251 (キリル文字) 文字セットを使用。
112 Greek_BIN バイナリ順、1253 (ギリシャ語) 文字セットを使用。
113 SQL_Latin1_General_Cp1253_CS_AS 辞書順、大文字小文字を区別する、1253 (ギリシャ語) 文字セットを使用。
114 SQL_Latin1_General_Cp1253_CI_AS 辞書順、大文字小文字を区別しない、1253 (ギリシャ語) 文字セットを使用。
120 SQL_MixDiction_Cp1253_CS_AS 複合辞書順、1253 (ギリシャ語) 文字セットを使用。
121 SQL_AltDiction_Cp1253_CS_AS 辞書順、大文字小文字を区別する、アクセントを区別する、1253 (ギリシャ語) 文字セットを使用。
124 SQL_Latin1_General_Cp1253_CI_AI 辞書順、大文字小文字を区別しない、アクセントを区別しない、1253 (ギリシャ語) 文字セットを使用。
128 Turkish_BIN バイナリ順、1254 (トルコ語) 文字セットを使用。
129 SQL_Latin1_General_Cp1254_CS_AS 辞書順、大文字小文字を区別する、1254 (トルコ語) 文字セットを使用。
130 SQL_Latin1_General_Cp1254_CI_AS 辞書順、大文字小文字を区別しない、1254 (トルコ語) 文字セットを使用。
136 Hebrew_BIN バイナリ順、1255 (ヘブライ語) 文字セットを使用。
137 SQL_Latin1_General_Cp1255_CS_AS 辞書順、大文字小文字を区別する、1255 (ヘブライ語) 文字セットを使用。
138 SQL_Latin1_General_Cp1255_CI_AS 辞書順、大文字小文字を区別しない、1255 (ヘブライ語) 文字セットを使用。
144 Arabic_BIN バイナリ順、1256 (アラビア語) 文字セットを使用。
145 SQL_Latin1_General_Cp1256_CS_AS 辞書順、大文字小文字を区別する、1256 (アラビア語) 文字セットを使用。
146 SQL_Latin1_General_Cp1256_CI_AS 辞書順、大文字小文字を区別しない、1256 (アラビア語) 文字セットを使用。
152 バイナリ順、1257 (バルト語) 文字セットを使用。
153 SQL_Latin1_General_Cp1257_CS_AS 辞書順、大文字小文字を区別する、1257 (バルト語) 文字セットを使用。
154 SQL_Latin1_General_Cp1257_CI_AS 辞書順、大文字小文字を区別しない、1257 (バルト語) 文字セットを使用。
155 SQL_Estonian_Cp1257_CS_AS エストニア辞書順、大文字小文字を区別する、1257 (バルト語) 文字セットを使用。
156 SQL_Estonian_Cp1257_CI_AS エストニア辞書順、大文字小文字を区別しない、1257 (バルト語) 文字セットを使用。
157 SQL_Latvian_Cp1257_CS_AS ラトビア辞書順、大文字小文字を区別する、1257 (バルト語) 文字セットを使用。
158 SQL_Latvian_Cp1257_CI_AS ラトビア辞書順、大文字小文字を区別しない、1257 (バルト語) 文字セットを使用。
159 SQL_Lithuanian_Cp1257_CS_AS リトアニア辞書順、大文字小文字を区別する、1257 (バルト語) 文字セットを使用。
160 SQL_Lithuanian_Cp1257_CI_AS リトアニア辞書順、大文字小文字を区別しない、1257 (バルト語) 文字セットを使用。
183 SQL_Danish_Pref_Cp1_CI_AS デンマーク/ノルウェー辞書順、大文字小文字を区別しない、大文字優先、1252 文字セットを使用。
184 SQL_SwedishPhone_Pref_Cp1_CI_AS スウェーデン/フィンランド (標準) 辞書順、大文字小文字を区別しない、大文字優先、1252 文字セットを使用。
185 SQL_SwedishStd_Pref_Cp1_CI_AS スウェーデン/フィンランド (電話番号) 辞書順、大文字小文字を区別しない、大文字優先、1252 文字セットを使用。
186 SQL_Icelandic_Pref_Cp1_CI_AS アイスランド辞書順、大文字小文字を区別しない、大文字優先、1252 文字セットを使用。
192 Japanese_BIN バイナリ順、932 (日本語) 文字セットを使用。
193 Japanese_CI_AS 辞書順、大文字小文字を区別しない、932 (日本語) 文字セットを使用。
194 Korean_Wansung_BIN バイナリ順、949 (韓国語) 文字セットを使用。
195 Korean_Wansung_CI_AS 辞書順、大文字小文字を区別しない、949 (韓国語) 文字セットを使用。
196 Chinese_Taiwan_Stroke_BIN バイナリ順、950 (中国語繁体字) 文字セットを使用。
197 Chinese_Taiwan_Stroke_CI_AS 辞書順、大文字小文字を区別しない、大文字優先、950 (中国語繁体字) 文字セットを使用。
198 Chinese_PRC_BIN バイナリ順、936 (中国語簡体字) 文字セットを使用。
199 Chinese_PRC_CI_AS 辞書順、大文字小文字を区別しない、936 (中国語簡体字) 文字セットを使用。
200 Japanese_CS_AS 辞書順、大文字小文字を区別する、932 (日本語) 文字セットを使用。
201 Korean_Wansung_CS_AS 辞書順、大文字小文字を区別する、949 (韓国語) 文字セットを使用。
202 Chinese_Taiwan_Stroke_CS_AS 辞書順、大文字小文字を区別する、950 (中国語繁体字) 文字セットを使用。
203 Chinese_PRC_CS_AS 辞書順、大文字小文字を区別する、936 (中国語簡体字) 文字セットを使用。
204 Thai_BIN バイナリ順、874 (タイ語) 文字セットを使用。
205 Thai_CI_AS 辞書順、大文字小文字を区別しない、874 (タイ語) 文字セットを使用。
206 Thai_CS_AS 辞書順、大文字小文字を区別する、874 (タイ語) 文字セットを使用。
210 SQL_EBCDIC037_CP1_CS_AS
211 SQL_EBCDIC273_CP1_CS_AS
212 SQL_EBCDIC277_CP1_CS_AS
213 SQL_EBCDIC278_CP1_CS_AS
214 SQL_EBCDIC280_CP1_CS_AS
215 SQL_EBCDIC284_CP1_CS_AS
216 SQL_EBCDIC285_CP1_CS_AS
217 SQL_EBCDIC297_CP1_CS_AS
※ データベースの既存の照合順序を変更しても、既存のユーザー定義テーブル内の列の照合順序は変わりません。
Japanese_CI_AS から Japanese_BIN に変更するには、
ALTER DATABASE [DB_Name] COLLATE Japanese_BIN
を実行する必要があります。
特番: Vistaの新文字セットが引き起こすトラブル
http://itpro.nikkeibp.co.jp/99/vista/index.html
Windows Vistaで追加された文字の利用にはご注意
http://itpro.nikkeibp.co.jp/article/NEWS/20061122/254684/
倶 剥 叱 呑 嘘 妍 屏 并 痩 繋
の追加された正字が略字とは別のキャラクタ・コードなるので、検索する場合に注意が必要そう。
第9回■上流工程で文字集合仕様と文字エンコーディングを決定する 文字コードに関する注意点(5)
http://itpro.nikkeibp.co.jp/article/COLUMN/20090309/326139/
新常用漢字表が迫るUnicode移行、「シフトJIS」では対応不可能
http://itpro.nikkeibp.co.jp/article/COLUMN/20091209/341831/
SQL組み立て時の引数チェック(IPA)
http://www.ipa.go.jp/security/awareness/vendor/programming/a02_01.html
------------------------------------------------------
エラー 14274
MSXサーバーからのジョブ、ステップ、スケジュールの追加、更新、または削除は出来ません。
ハマッった。
ジョブを削除するには、名前を元に戻すしか方法が無いようです。
[PRB] サーバーの名前を変更した後で SQL Server エージェント ジョブを更新するとエラー 14274 が発生する
http://support.microsoft.com/kb/281642
古いコンピュータ名を覚えてない場合
少し前のイベントログを開けば確認できるはずです…
あと、コンピュータ名を変更後に
sp_dropserver '旧コンピュータ名'
go
sp_addserver '新コンピュータ名','local' 又は 'remote'
go
正しいコンピュータ名が出力されているか確認
select @@SERVERNAME
go
この操作を行っても SQL Enterprise managerに登録されているコンピュータ名は自動的に変更されないそうなので
SQL Enterprise Managerで変更後のコンピュータ名を追加し、変更前のコンピュータ名を削除する。
リモートコンピュータ又はローカルコンピュータ名はSQLServerではmaster.dbo.sysserversテーブルに格納されており
Windows Server のコンピュータ名を変更した場合には、このテーブルを更新する必要がある。
その為に sp_dropserver、sp_addserverプロシジャーを実行する必要がある。
また .NET開発環境でストアドプロシージャのデバッグが正常に機能しなくなる。
------------------------------------------------------
またハマッた。
♠ ♣ ♥ ♦ © ® ↔ ↵
上記 symbol フォントを char フィールドに保存しようとしたら
「入力した値は、列のデータ型またはデータ長と一致しないか、グリッド バッファの制限を越えています。」
と出て保存できねぇ…
nchar にして解決したけど、文字列型には保存できないって事?
とりあえず設計する場合は、Unicode文字列型 にしとくのが無難かも。
------------------------------------------------------
外部連結(アウタージョイン)
商品別売り上げデータの集計(売上の無かったデータも出力)
SELECT B.商品名, SUM(A.数量)
FROM 売上データ A, 商品マスタ B
WHERE A.商品ID =* B.商品ID
GROUP BY B.商品名
結果
商品名 数量
------ ---
A 1
B
C 5
D 10
E
F
全て出力したいテーブルに対して *= か =*
------------------------------------------------------
TIMESTAMP 型を利用する
CREATE TABLE T_TEST(F1 TIMESTAMP NOT NULL, F2 INT NULL)
INSERT INTO T_TEST(F2) VALUES(123)
SELECT * FROM T_TEST
結果は
F1 F2
0x00000000000000D2 123
------------------------------------------------------
UNIQUEIDENTIFIER 型を利用する
CREATE TABLE T_TEST(F1 UNIQUEIDENTIFIER NOT NULL, F2 INT NULL)
DECLARE @UNIQ UNIQUEIDENTIFIER
SET @UNIQ = NewID()
INSERT INTO T_TEST(F1, F2) VALUES(@UNIQ, 123)
SELECT * FROM T_TEST
結果は
F1 F2
DA274F03-7920-47B3-8348-CB75F77B523F 123
------------------------------------------------------
M_FILE をテンポラリに複製
SELECT * INTO #TMP_FILE FROM M_FILE
テンポラリはセッションが切れると自動削除される。
Drop Table #TMP_FILE
で削除出来る。
##TMP_FILE とするとグローバル・テンポラリとなり
テーブルの定義は永久的にデータベース内に残る。
http://www.microsoft.com/japan/sql/prodinfo/compare/fororacle/sqlserver_02_chap1_08.mspx
※ OS 再起動後は削除される。
------------------------------------------------------
PIVOT
SQL Server 2005 以降で利用可能で、いわゆる Access のクロス集計。
UID QUE ANS
------------
001 Q01 1
001 Q01 2
001 Q01 3
002 Q01 3
002 Q02 3
003 Q01 1
003 Q02 1
が
UID QUE A1 A2 A3
-----------------
001 Q01 1 1 1
002 Q01 1 0 0
002 Q02 0 0 1
003 Q01 1 0 0
003 Q02 1 0 0
みたいな。
SELECT UID, QUE, [1] AS A1, [2] AS A2, [3] AS A3 FROM
( SELECT UID, QUE, CAST(ANS AS INT) AS ANS FROM T_PIVOT ) AS TBL
PIVOT ( COUNT(TBL.ANS) FOR TBL.ANS IN([1],[2],[3]) ) AS P
こんな感じで。
PIVOT と UNPIVOT の使用 http://msdn.microsoft.com/ja-jp/library/ms177410.aspx
------------------------------------------------------
UNION
SQL の連結に。 重複も含める場合は UNION ALL
SELECT Label FROM TABLE1
UNION
SELECT Label FROM TABLE2
みたいな。
------------------------------------------------------
CASE
条件式で絞り込みたい場合とか。
昇順並び替えで空白行を最後に持っていくには
ORDER BY
CASE WHEN FIELD IS NULL THEN '1'
WHEN FIELD = '' THEN '1'
ELSE '0' + FIELD
日付判定など。
SELECT CASE WHEN ISDATE(strDate)=1 THEN 1
ELSE 0 END AS DATE
------------------------------------------------------
IN
複数の値で絞り込みたい場合に。
WHERE ID IN (1, 2, 3)
WHERE ID IN (SELECT ID FROM TABLE)
など。
------------------------------------------------------
Access とSQL Server の構文
Access 構文 SQL Server 構文
DISTINCTROW クエリが複数テーブルの結合の場合はDISTINCTですが、1
FROM FROM
GROUP BY GROUP BY
HAVING HAVING
INTO INTO
なし COMPUTE
なし FOR BROWSE
なし OPTION
ORDER BY ビューではサポートなし
SELECT SELECT
SELECT TOP N [PERCENT] SELECT TOP N [PERCENT]
UNION (ALL) UNION (ALL)
WHERE WHERE
WITH OWNER ACCESS なし
なし GROUPING (column_name)
AVG AVG ([ALL | DISTINCT] expression)
COUNT(*) COUNT(*)
COUNT(column) COUNT ([ALL | DISTINCT] expression)
FIRST, LAST なし
MAKE TABLE, ALTER TABLE CREATE TABLE, ALTER TABLE
MAX MAX(expression)
MIN MIN(expression)
PIVOT なし
STDEV, STDEVP STDEV, STDEVP
SUM SUM ([ALL | DISTINCT] expression)
TRANSFORM (SELECT ステートメント) SELECT ステートメントにおける WITH ROLLUP, WITH CUBE
VAR, VARP VAR, VARP
ADD COLUMN ADD COLUMN
CONSTRAINT CONSTRAINT
DROP COLUMN DROP COLUMN
なし GRANT, LOCK
DROP INDEX DROP INDEX
“&”による文字列連結 “+”による文字列連結
Cint(x) CONVERT(smallint,x)
CLng(x) CONVERT (int,x)
CSng(x) CONVERT (real,x)
CDbl(x) CONVERT (float,x)
CStr(x) CONVERT (varchar,x)
Ccur(x) CONVERT (money,x)
CVdate(x) CONVERT (datetime,x)
DATEADD() DATEADD
DATEDIFF() DATEDIFF
FORMAT() DATENAME
DATEPART() DATEPART
NOW(), DATE() GETDATE
ASC() ASCII()
INSTR() CHARINDEX
STRING() REPLICATE
STRREVERSE() REVERSE
STR() STR
オートナンバー(長整数)型 int(Identity)
バイナリ型 varbinary
バイト型 Smallint
通貨型 Money
日付/時刻型 Datetime
倍精度浮動小数点型 Float
ハイパーリンク型 ntext(リンク機能は喪失)
整数型 Smallint
長整数型 Int
メモ型 Ntext
メモ型 Text
数値型 Decimal
数値型 Float
数値型 Int
数値型 Decimal
数値型 Real
数値型 Smallint
数値型 Tinyint
数値型 uniqueidentifier
OLEオブジェクト型 Image
レプリケーションID型 varbinary
単精度浮動小数点型 Real
テキスト型 Nvarchar
テキスト型 Varchar
Yes/No型 Bit
Microsoft SQL Server 2000 リソースキット
第 5 章 ‐ Access 2000 データベースから SQL Server 2000 への移行
http://www.microsoft.com/japan/technet/prodtechnol/sql/2000/books/c0561.mspx
AccessのレポートをWebベースに
http://techtarget.itmedia.co.jp/tt/news/0603/16/news02.html
------------------------------------------------------
文字列関数
ASCII 文字をASCIIコードに変換
CHAR ASCIIコードを文字コードに変換
CHARINDEX 文字列内の文字列検索
LEN 文字列長
LOWER 小文字への変換
UPPER 大文字へ変換
LTRIM 左側から空白削除
RTRIM 右側から空白削除
REPLACE 文字列置換
SUBSTRING 文字列より指定部分を抽出
算術関数 http://allabout.co.jp/career/database/closeup/CU20020224/index.htm
変換関数 http://allabout.co.jp/career/database/closeup/CU20020223/index.htm
日付関数 http://allabout.co.jp/career/database/closeup/CU20020222/index.htm
文字列関数 http://allabout.co.jp/career/database/closeup/CU20020221/index.htm
集計関数 http://allabout.co.jp/career/database/closeup/CU20020220/index.htm
------------------------------------------------------
テーブル情報の取得
SP_HELP 又は SP_TABLES
テーブルの列情報取得
SP_HELP 又は SP_COLUMNS
商品マスタの列情報を取得 SP_COLUMNS 商品マスタ
インデックス一覧を取得
SP_HELP 又は SP_HELPINDEX
ビュー情報、定義の取得
SP_HELP、SP_HELPTEXT
プロシージャ情報の取得
一覧の取得 SP_HELP、SP_STORED_PROCEDURES
情報の取得 SP_HELP
定義の取得 SP_HELPTEXT
セッション情報取得
SP_WHO
権限の一覧
SP_HELPROTECT
ユーザ名 'sa' の権限表示
SP_HELPROTECT @username='sa'
テーブルについての権限表示
SP_TABLE_PRIVILEGES
テーブルの列についての権限表示
SP_COLUMN_PRIVILEGES
------------------------------------------------------
反復制御 WHILE
SET @I=0
WHILE (@I>=10)
BEGIN
SET @I = @I + 1
IF @I = 5
CONTINUE -- ループの残りを無視しループの先頭に戻って処理続行
IF @I = 8
BREAK -- ループ処理を中断
PRINT @I
END
------------------------------------------------------
カーソル
DECLARE cur CURSOR LOCAL FOR --カーソル宣言
SELECT ID FROM 商品マスタ
DECLARE @ID INT
DECLARE @CNT INT
BEGIN
SET @CNT = 0
OPEN cur --オープン
FETCH NEXT FROM cur INTO @ID --変数に値を格納
WHILE @@FETCH_STATUS = 0
BEGIN
SET @CNT = @CNT + 1
PRINT @ID
FETCH NEXT FROM cur INTO @ID
END
CLOSE cur --クローズ
DEALLOCATE cur --カーソル参照を削除
PRINT @CNT
END
------------------------------------------------------
トランザクション
SET NOCOUNT ON --(件処理されました)のメッセージ表示を抑止
CREATE TABLE #TEST(
ID INT IDENTITY(1,1),
ID2 VARCHAR(6)
)
DECLARE @NewID INT
BEGIN TRANSACTION
INSERT INTO #TEST(ID2) VALUES('TEST')
IF @@ERROR = 0
BEGIN
SET @NewID = @@IDENTITY
-- SQL Server 2005 の場合は @@IDENTITY の代わりに SCOPE_IDENTITY() を利用。
-- http://msdn2.microsoft.com/ja-JP/library/ms190315.aspx
COMMIT TRANSACTION
END
ELSE
BEGIN
SET @NewID = @@ERROR
ROLLBACK TRANSACTION
END
SELECT @NewID 'オートナンバ値'
SELECT * FROM #TEST
DROP TABLE #TEST
ストアドプロシージャによる繰り返し処理
http://www.atmarkit.co.jp/fnetwork/rensai/sql22/sql1.html
------------------------------------------------------
2005 以降では TRY CATCH が利用できるようになりました。
http://www.atmarkit.co.jp/fdotnet/vs2005db/vs2005db_09/vs2005db_09_01.html
BEGIN TRY
BEGIN TRANSACTION
--書き込み処理
COMMIT TRANSACTION
END TRY
COMMIT TRANSACTION
BEGIN CATCH --えらった
IF (XACT_STATE()) = -1 OR IF (XACT_STATE()) = 1
ROLLBACK TRANSACTION
PRINT 'ErrMessage :' + ERROR_MESSAGE()
PRINT 'ErrNumber :' + CAST(ERROR_NUMBER() AS VARCHAR(10))
PRINT 'ErrSeverity:' + CAST(ERROR_SEVERITY() AS VARCHAR(10))
PRINT 'ErrState :' + CAST(ERROR_STATE() AS VARCHAR(10))
END CATCH
MAXRECURSION を使ったエラー判定に。
BEGIN TRY
SELECT * FROM データベース名 OPTION (MAXRECURSION 2);
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH
こんな感じで。
------------------------------------------------------
[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionCheckForData (CheckforData()).
サーバー : メッセージ 11、レベル 16、状態 1、行 0
一般的なネットワーク エラーです。ネットワークのマニュアルを調べてください。
接続が解除されました
と出た場合の対応
DBファイルが破損している可能性があるので
DBCC CHECKDB
をしてみる。※ SQL の記述ミスでも出るっぽい?
検出されたエラーを DBCC CHECKDB が修復するように指定します。
DBCC CHECKDB ('データベース名',REPAIR_REBUILD)
修復ステートメントは処理されませんでした。データベースをシングル ユーザー モードに設定する必要があります。
DBCC の実行が完了しました。DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。
シングルモードにする。
ALTER DATABASE データベース名
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
これにより、データベースがシングルユーザー モードに変更される。
マルチユーザー モードへ戻すには
ALTER DATABASE データベース名
SET MULTI_USER
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/tsqlref/ts_dbcc_00gy.asp
http://www.microsoft.com/japan/technet/prodtechnol/sql/2000/books/c12ppcsq.mspx
SQL Server でメール出す
Exchange Server と Microsoft Outlook が必要なので参考リンクのみ
SQL Mail
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/adminsql/ad_1_server_4bsc.asp
[INF] SQL Mail の設定方法
http://support.microsoft.com/kb/263556/JA/
SQL Server : SQL Mail に関してよく寄せられる質問
http://support.microsoft.com/kb/311231/ja
SQL Server E-mail
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnovba01/html/SQLServerE-mail.asp
データベース メール構成ウィザード
http://msdn2.microsoft.com/ja-jp/library/ms175951.aspx
SQL Mailを使わずにメールを送信する方法があるようで。
[HOWTO] SQL Server で SQL Mail を使用せずに電子メールを送信する方法
http://support.microsoft.com/kb/312839
そのうち調べよう…
SQL Server 2005 64 ビット版で、ジョブ状態の通知と警告の通知を送信するように SQL Server エージェントを構成する方法
http://support.microsoft.com/kb/908360/ja
SQL Server 2000 の SQL Server Agent が起動に失敗するようで...
起動を遅らせるか、リトライさせる処理を自作する必要があるようです。
SQL Server Agent failing to start because "The EventLog service has not been started";
http://blogs.msdn.com/ialonso/archive/2007/12/13/sql-server-agent-failing-to-start-because-the-eventlog-service-has-not-been-started.aspx
OLE オートメーションを使って外部プログラムの実行
DECLARE @SHELL INT
DECLARE @CMD INT
EXEC SP_OACREATE 'wscript.shell', @SHELL OUT
EXEC @CMD=SP_OAMETHOD @SHELL,'run', null, 'cmd.exe /c dir >c:\test.txt'
※クエリアナライザで実行すると Cドライブのルートに test.txt が出来ます。。。
SQL Server 2003 では SQLCLR を利用できます。
トリガー
作成
CREATE TRIGGER トリガー名
ON テーブル名
FOR トリガーイベント(INSERT, UPDATE, DELETE)
AS
SQL ステートメント
削除
DROP TRIGGER トリガー名
・起動のタイミングは INSERT, UPDATE, DELETE が実行されたとき。
・ユーザーがトリガーを指定して実行する事は出来ない。
・SQL Server はトリガーイベント文の実行後にトリガーが起動する。
トリガーを使ったテーブルに ID 列がある場合で、@@IDENTITY を拾う場合は SCOPE_IDENTITY() を使う。
SCOPE_IDENTITY()
http://msdn2.microsoft.com/ja-jp/library/ms190315.aspx
Microsoft Data Access Components 2.8 がインストールされるコンピュータに SQL Server 2005 データベースからアプリケーションが ID 列の不正の値を受け取ります。
http://support.microsoft.com/kb/940569
------------------------------------------------------
データベース(DBマスタ)への更新を 00:00 〜 03:59 時に制限する
CREATE TRIGGER TEST1
ON DBマスタ
FOR INSERT, UPDATE, DELETE
AS
IF DATEPART(HH, GETDATE()) < 0 OR DATEPART(HH, GETDATE()) >= 3
BIGIN
RAISERROR('時間外の更新は出来ません。',16,1) --エラー メッセージを設定
ROLLBACK TRANSACTION
END
------------------------------------------------------
更新履歴をトリガで作成する
http://blogs.sqlpassj.org/yoshihirokawabata/articles/7527.aspx
インデッスクの作成
作成
CREATE INDEX インデックス名
ON テーブル名(対象列名[, 対象列名, …])
削除
DROP INDEX テーブル名.インデックス名
・データ量が少ない時は、インデックスを使うと遅くなる場合がある。
・データを更新する場合は、インデックスも更新しなければならないので余分に時間がかかる。
・インデックスは SELECT 文の WHERE 句で使われる列に対して作成すると良い。
(テーブルの結合や対象データの絞込みが効率的に行われる)
SQL Server 2000 インデックスの最適化に関するベスト プラクティス
http://s.microsoft.com/japan/technet/prodtechnol/sql/2000/maintain/ss2kidbp.mspx
インデックスの最適化
http://msdn2.microsoft.com/ja-jp/library/ms190910.aspx
インデックスの再編成と再構築
http://msdn.microsoft.com/ja-jp/library/ms189858.aspx
SQL Server 2008 ではインデックス作成時に WHERE が利用できるようになりました。
クエリーでインデックスと同じ WHERE を指定すると、該当するインデックスが利用されます。
WHERE で対応する行を大きく減らすことができる場合に有効です。
CREATE INDEX インデックス名
ON テーブル名(対象列名[, 対象列名, …])
WHERE [対象列名] = 条件;
これにより
・インデックスのサイズを小さくなる
・実行プランで、処理時間の短縮(「I/O の推定コスト」が小さくなる)
------------------------------------------------------
ビューの作成
作成
CREATE VIEW ビュー名
AS
SQL ステートメント
削除
DROP VIEW ビュー名
・複雑なSQL文を簡略化できる
・実テーブルを隠蔽できる
------------------------------------------------------
CREATE VIEW 商品別売上
AS
SELECT B.商品名, SUM(B.単価 * A.数量) '総売上'
FROM 売上データ A, 売上マスタ B
WHERE A.商品名 = B.商品名
GROUP BY B.商品名
結果
商品名 総売上
------- ------
A 100000
B 80000
C 1000
XML で出力する。
SQL Server 2000 のインデックス付きビューによるパフォーマンスの向上
http://www.microsoft.com/japan/msdn/sqlserver/sql2000/Indexedviews.asp
第1回:リレーショナルDBからXML文書を取り出す
http://www.atmarkit.co.jp/fxml/tanpatsu/15mssql/mssql01.html
SQLXML
SQLXML 2.0 (XML for SQL Server 2000 Web Release 2) 日本語
SQLXML 3.0 RTM
SQLXML 3.0 SP1
SqlXml 3.0 SP2 - 日本語
SqlXml 3.0 Service Pack 3 (SP3)
SQL Server 2005 での SQLCLR を使用した XML プラン表示の処理
インターネットを流れる標準文書XML(1)
http://itpro.nikkeibp.co.jp/article/NPC/20060425/236152/
------------------------------------------------------
関連資料
DBエンジニアが知っておくべき情報源を一括更新
http://www.atmarkit.co.jp/fdb/rensai/dbwatch2007/dbwatch200704_1.html
〜 初めて学ぶ Transact-SQL 〜
第 1 章 「Transact-SQL の基本」
http://www.microsoft.com/japan/msdn/sqlserver/columns/T-SQL/T-SQL1.asp
第 2 章 「クエリアナライザ」
http://www.microsoft.com/japan/msdn/sqlserver/columns/T-SQL/T-SQL2.asp
第 3 章 「SELECT ステートメント(1)」
http://www.microsoft.com/japan/msdn/sqlserver/columns/T-SQL/T-SQL3.asp
第 4 章 「SELECT ステートメント (2)」
http://www.microsoft.com/japan/msdn/sqlserver/columns/T-SQL/T-SQL4.asp
第 5 章 「INSERT,DELETE,UPDATEステートメント」
http://www.microsoft.com/japan/msdn/sqlserver/columns/T-SQL/T-SQL5.asp
さらっと覚えるSQL&T-SQL入門(1)初めてSQLコマンドを叩く緊張と感動の一瞬
データベース入門
開発者のための SQL Server パフォーマンス チューニング/最適化講座
第 3 部 ‐ SQL Server の環境設定によるパフォーマンス向上
SQL Serverから最高のパフォーマンスを引き出す「Spotlight on SQL Server」の問題解決力とは?
インテルのハイパースレッディング技術でサーバ性能の低下が発生か - CNET Japan
SQL Serverというブラックボックスを開いてみる
1つのSQL文で複数の表にINSERTする絶品テクニック
構成オプションを使用して SQL Server のメモリ使用量を調整する方法
誰も知らないメモリ・チューニングの極意を教えよう
真のデータベースエンジニアを目指そう!データベースエンジニアへの道(1)
DBエンジニアに必須の情報源をアップデート
システムの安定稼働の「3カ条」
パフォーマンスを満たす物理メモリ量を算出する
第5回 データへの最短ルートを確保せよ!
DBチューニングではディスクI/O性能を注視する
ハード(I/O の集中を分散させる)では
・OSと物理ドライブを分ける。
1つしか無い場合は、パーティションを切る。(OS の I/O スケジューラ機能が効いてパフォーマンスの向上を見込める)
・CPU の数分 データファイルを作成(アクセスを分散させる設計をする)http://www.sqlpassj.org/dbe/dba/02.aspx#2
・NTFS フォーマット時に 64KB のアロケーションユニットサイズにする
(1 ページ = 8KB で構成され、1 エクステンド = 8 ページで構成されているから 64KB が最適)http://msdn2.microsoft.com/ja-jp/library/ms190761.aspx
・データファイルとトランザクションファイルは別の場所にする。
・RAIDを組む。
パフォーマンスの監視とチューニング
http://msdn2.microsoft.com/ja-jp/library/ms189081(sql.90).aspx
SQL Server 6.5 I/O パフォーマンス チューニング クイック リファレンス
http://www.microsoft.com/japan/technet/prodtechnol/sql/70/maintain/sqliopt.mspx
SQL Server 7.0 パフォーマンス チューニング ガイド
http://www.microsoft.com/japan/technet/prodtechnol/sql/70/maintain/sql7pt.mspx
データベース パフォーマンスの最適化の概要
http://www.microsoft.com/japan/developer/library/optimsql/odp_tunovw_9mxz.htm
SQL パフォーマンス チューニング シリーズ
http://technet.microsoft.com/ja-jp/sql_5mins11.aspx
Western Digital、3TBのCaviar Greenを出荷開始
http://pc.watch.impress.co.jp/docs/news/20101020_401166.html
【WD】WD製HDD友の会 EARS専用 1セクタ目【AFT】
http://hibari.2ch.net/test/read.cgi/jisaku/1284672065/
マイクロソフト、SQL Serverのパフォーマンスチューニングサービスを開始
SQL Server 2008ドキュメントは読み応え十分/ボトルネック解消のヒント
I/Oボトルネックの病巣はこれで究明できる
メモリの自動チューニング機能を完全に把握しよう
最短かつ最速にアクセスする「DB高速化技術」(前編)
特集:基礎から理解するデータベースのしくみ
2004 年 1 月更新の SQL Server Books Online
SQL Server のデタッチとアタッチ機能を使用して SQL Server データベースを新しい場所に移動する方法
SQLIOStress ユーティリティを使用して SQL Server などのディスク サブシステムに負荷をかける方法
データ変換サービス (DTS) を使用して Microsoft Access データベースから SQL Server データベースにデータをエクスポートする方法
[BUG] 仮想 SQL Server 2000 の Windows 2000 DC へのインストール失敗
[HOW TO] Microsoft SQL Server から Microsoft Excel にデータをインポートする
SQL Server のリンク サーバーおよび分散クエリで Excel を使用する方法
SQL Server のインスタンスに接続したときのエラー メッセージ : "ユーザーの既定データベースを開けません"
[INF] PSS が SQL Server レプリケーションのトラブルシューティングを行うときに必要な情報
SQL Server 2000 または SQL Server 7.0 で仮想メモリが不足して多数のデータベースを保持できないことがある
[HOWTO] Active Directory からの情報を SQL Server 2000 データベースに設定する方法
[HOWTO] DTS: Excel から SQL Server にデータをインポートする方法
Visual Studio .NET を使用して Visual SourceSafe に SQL Server 2000 ストアド プロシージャを追加する方法
マイクロソフトではサードパーティ製品が SQL Server と連携して動作することを保証しない
FIX: Windows Server 2003 での ADO アプリケーションでエラー メッセージを表示するとき、 SQLState セクションとエラー メッセージの NativeError セクションが見付かりません。
リンク サーバーの追加
リンク サーバー名を使用したデータ ソースの識別
外部データのアクセス
SELECT * FROM OpenRowset('Microsoft.Jet.OLEDB.4.0','c:\northwind.mdb';'admin'; '',
'SELECT CustomerID, CompanyName FROM Customers WHERE Region = ''WA'' ')
こんな事も出来るようで。
この辺り
分散クエリ アーキテクチャ
http://msdn.microsoft.com/library/ja/?url=/library/ja/architec/8_ar_sa_6vz9.asp
OPENDATASOURCE
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/tsqlref/ts_oa-oz_2be1.asp
これを悪用し SQL インジェクションによって全データぶっこ抜かれる可能性もあるようで…
OpenRowset を使用不可にするレジストリ
デフォルトインスタンス
KEY HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\Providers\SQLOLEDB
名前付きインスタンス
KEY HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server\<InstaneceName>\Providers\MSDASQL
値の名前 : OpenRowSet
データ型 : REG_DWORD
値 : 0x00000001
参考
SQL Injection攻撃の脅威と対策について
http://www.cyberpolice.go.jp/server/rd_env/pdf/20060330_SQLInjection.pdf
開発者のための正しいCSRF対策
http://www.jumperz.net/texts/csrf.htm
CIAC Technical Bulletin CIACTech06-001 Protecting Against SQL Injection Attacks
http://www.ciac.org/ciac/techbull/CIACTech06-001.shtml
今夜分かるSQLインジェクション対策
http://www.atmarkit.co.jp/fsecurity/column/ueno/42.html
IPAが「安全なWebサイトの作り方」改訂版を公開,CSRFの解説などを追加
http://itpro.nikkeibp.co.jp/article/NEWS/20061101/252426/
ITスキル標準V2 2006ダウンロード
http://www.ipa.go.jp/jinzai/itss/download_V2_2006.html
【CIOセキュリティ・インシデント対策講座】
http://itpro.nikkeibp.co.jp/article/COLUMN/20061020/251323/
YouTube で SQL Injection を確認
http://www.youtube.com/results?search_query=SQL+Injection
ラック、データベース内の情報保護対策を無償公開
http://itpro.nikkeibp.co.jp/article/NEWS/20070913/281818/
リンク サーバー クエリに変数を渡す方法
[HOWTO] DisallowAdHocAccess 設定を使用してリンク サーバーへのアクセスを制御する方法
サーバー名パラメータを接続文字列で使用して、クライアント ネットワーク ライブラリを指定する方法
8. Accessのテーブルへリンク(PASSJ) http://www.sqlpassj.org/bunkakai/begin/series/s04/0408.aspx
第4回 InfoPathからSQL文を実行する http://www.atmarkit.co.jp/fwin2k/operation/infopath04/infopath04_01.html
Excel 2002/2003 Add-in for SQL Server Analysis Services
Excel 2002 アドイン: ODBC (Open Database Connectivity)
サーバー クラスタ : Windows 2000 および Windows Server 2003 に関するよく寄せられる質問
SQL Server エラー ログの数を増やす方法
Microsoft Cluster Server への SQL Server 2000 Enterprise Edition のインストール順序
よく寄せられる質問 - SQL Server 2000 - フェールオーバー クラスタリング
SQL Server への接続時に Windows NT LM Security Support Provider レジストリ キーが見つからない場合、エラー メッセージ "SSPI コンテキストを生成できません" が表示される
[PRB] SQL Server Enterprise Manager でレプリケーション エージェントが中断されたというメッセージが出力される
SQL Server サービス アカウントがドメイン ユーザーの場合に警告情報 "SuperSocket 情報" が表示される
[PRB] クラスタでフルテキスト リソースがオンラインにならず、"イベント ID 1069 : クラスタ リソース 'SQL Full Text' は失敗しました" というエラー メッセージが出力される
スタンドアロン サーバーで SQL Server サービスおよび SQL Server エージェント サービスの開始に失敗する
[INF] SQL Server における自動拡張および自動圧縮の構成に関する注意事項
ASP.NET から SQL Server への信頼されたデータ接続を作成するとエラー メッセージ "ユーザー 'AccountName' はログインできませんでした" が表示される
[HOWTO] SQL Server で sp_OA ストアド プロシージャと SQL 分散管理オブジェクト (SQL-DMO) を使用してジョブのスクリプトを作成する方法
[PRB] SQL Server Enterprise Manager でビューの列名に余分なスペースが挿入される
[HOWTO] SQL Server 2000 で使用中のユーザー定義データ型の所有者を変更する方法
Windows Server 2003 用 SQL Server 2000 Desktop Engine (Windows) の重要な更新 (KB829358) について
SQL Server 2000 または SQL Server 2005 に接続するときに "SQL Server の信頼関係接続に関連付けられていません"というエラー メッセージが表示されることがある
SQL Server 2005 のデータベース チューニング アドバイザ (DTA) クリーンアップ スクリプトの説明
Windows Server 2003 Service Pack 2-based コンピュータの行を更新するために、 SQL Server の OLE DB プロバイダを使用する場合、エラー メッセージ:"不正のキーワード近い構文「場所」"
BULK INSERT を使ってディスク (ネットワーク、フロッピー ディスク、ハード ディスク などを含む) からデータをコピーできます。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/tsqlref/ts_ba-bz_4fec.asp
bcp と BULK INSERT の使用
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/adminsql/ad_impt_bcp_2e5s.asp
へぇ…
チューニングのおさらい。
自分で調べた事と書いてあることは変らないっぽい・・・
DB管理者がいますぐ確認すべき3つの設定
http://www.atmarkit.co.jp/fdb/rensai/10_drk/04/drk01.html
SQL Server 2005 関連
Microsoft SQL Server 2005 Express Edition
SQL Server 2005 Express Edition ドキュメントとサンプル
Microsoft SQL Server 2005 用 Feature Pack- 2005 年 11 月
SQL Server 2005 Books Online
SQL Server 2005 ドキュメント
Express Editions のサイトが更新されて色々ダウンロード出来るようになっています。
http://www.microsoft.com/japan/msdn/vstudio/express/default.aspx
Server 2005 Service Pack 1 Express の各エディションおよびツールの Community Technology Preview (CTP)
MSDN2 ライブラリ
SQL Server 2005 CTPレビュー
SQL Server 2005 のパーティション分割されたテーブルとインデックス
Microsoft SQL Server 2005 の XML オプション
SQL Server 2005 のフルテキスト検索機能 : 内部構造と強化機能について
SQL Server2005 Beta 2 Transact-SQL の機能強化
SQL Server 2005 における CLR 統合の使用
SQL Server 2005 Beta 2 での Transact-SQL コードの編集
Microsoft SQL Server 2005 での FOR XML の新機能
XML データ型のパフォーマンスの最適化
SQL Server 2005 での SQLCLR を使用した XML プラン表示の処理
開発者向け機能ダイジェスト - SQL Server 2005 自習書シリーズ 開発編
Web サービス - SQL Server 2005 自習書シリーズ 開発編
Integration Services - SQL Server 2005 自習書シリーズ 開発編
ADO.NET 2.0 - SQL Server 2005 自習書シリーズ 開発編
SQL CLR - SQL Server 2005 自習書シリーズ 開発編
Integration Services - SQL Server 2005 自習書シリーズ 開発編
http://www.microsoft.com/japan/msdn/sqlserver/selfstudy/
Trace オブジェクトと Replay オブジェクト : SQL Server のトレースと再生用の新しい API
SQL Server 2005 Integration Services: 第 1 部 - プロジェクト REAL からの教訓
SQL Server 2005 の複数のアクティブな結果セット (MARS)
Analysis Services 2005 でのデータ整合性の問題の処理
SQL Server 2005 Mobile Edition 3.0 のマルチユーザー環境におけるデータの同期に関する考慮事項
ADO.NET と SQLCLR を使用した SQL Server 内部でのマネージ データ アクセス
SQL Server 2005 の真実 テーマ:「処理能力」
Active Directory からの情報を SQL Server 2005 データベースに設定する方法
SQL Server 2000 と SQL Server 2005 で物理ファイルを統合し、論理ファイル名を変更する方法
SQL Server 2005 フルテキスト検索で、強化および更新されたノイズ ワード ファイルが使用される
SQL Server 2000 と SQL Server 2005 の一部のエディションでサポートされないチューニング オプション
SQL Server 2005 で DBCC SHRINKFILE ステートメントを使用してトランザクション ログ ファイルを圧縮する方法
SQL Server 2005 での SQL Server エージェント サービスの実行用にサポートされている Windows アカウントの種類
SQL Server Management Studio Express (SSMSE) Community Technology Preview (CTP) を入手する方法
Microsoft SQL Server Management Studio Express - Community Technology Preview (CTP) November 2005
SQL Server 2005 のデータベース ミラーリング機能を使用する場合の注意事項
SQL Server 2005 の Readme ファイルに対する変更点
[BUG] SQL Server 2005 Analysis Services のパフォーマンス モニタ カウンタが値を返さない
SQL Server 2005 のインストール時に表示されることがあるエラー メッセージ "エラー 1619 が sqlncli.dll のインストール中に発生しました" について
アプリケーション ロールに基づくアプリケーションで SQL Server 2005 の master データベースのいずれかのシステム テーブルからレコードを選択しようとすると、アクセスが拒否されましたという内容のエラー メッセージが表示されることがある
SQL Server 2005 のインスタンスへのリモート接続を作成するときに、Kerberos 認証を使用していることを確認する方法
BUG: SSIS サービスを既に実行しているコンピュータに SQL Server 2005 SP1 をインストールすると、SQL Server統合 サービス(SSIS)サービスが開始されません。
SQL Server 2005 Reporting Services をインストールすると、アプリケーション ログにイベント ID 1011 ".NET Runtime Optimization Service" エラーが頻発する
Trace オブジェクトと Replay オブジェクト : SQL Server のトレースと再生用の新しい API
Web ホスティング環境向け SQL Server 2005 展開ガイダンス 付録 : プロビジョニング スクリプト
スペシャル座談会「なぜ SQL Server を採用するのか」
今から始めるSQL Server 2005
ITProから見たSQL Server 2005 第1回 SQL Server 2005の概要
ITProから見たSQL Server 2005 第2回 データベース・エンジンの機能強化点
ITProから見たSQL Server 2005 第3回 SQL Server 2005の管理ツール
3週間で100万ダウンロード、MySQL 5.0は人気爆発
SQL Server 2005が正式発表に名古屋銀行は早くも運用を開始 NASDAQ、ロンドン証券取引所、百五銀行等も採用しています。
SQL Server 2005を使いこなそう(1)Integration Servicesで異種データも楽々インポート
第2回 無償データベース SQL Server 2005 Express Editionを使ってみよう
「SQL Server Express」と「MSDE」を比較する
SQLcheck レビュー
SQL CLRの仕組みとメリットを理解しよう
Reporting Servicesを使ったレポート作成の技
SSL
SSL に使用する証明書の構成
Kerberos
SQL Server で Kerberos 認証を使用する方法
OSQL を使ったバージョン確認
C:\>osql -E
1> select @@version
2> go
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Developer Edition on WindowsNT 5.2 (Build 3790: Service Pack 1)
(1 件処理されました)
1> quit
C:\>
SQL Server 2000 製品版 8.00.194 RTM
Desktop Engine SP1 8.00.384 SP1
Desktop Engine SP2 8.00.534 SP2
Desktop Engine SP3 8.00.760 SP3
Desktop Engine SP3a 8.00.760 SP3
MSDE 2000 Release A 8.00.760 SP3
MSDE 2000 SP4 8.00.2039 SP4
SQL Server 2000 SP4 8.00.2039 SP4
1> SELECT SERVERPROPERTY('Edition')
2> go
TOP で紹介しているSQL の場合は、Developer Edition と返されます。
また MSDE を利用している場合は、Desktop Engine という値が返されます。
sa パスワードが空白かどうかを確認する方法
C:\>osql -U sa
パスワード :
ユーザー 'sa' はログインできませんでした。
C:\>
Windows 認証のみに設定されている場合は
ユーザー 'sa' のログインに失敗しました。理由 : SQL Server の信頼関係接続に関連付けられていません。
と表示される。
sa パスワードを変更する方法
C:\>osql -U sa
パスワード :
1> sp_password @old=null, @new='password', @loginame='sa'
2> go
パスワードは変更されました。
1>
認証モードを特定または変更する方法
MSDE を既定の MSDE インスタンスとしてインストールした場合
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSqlserver\MSSqlServer
MSDE を名前付きインスタンスとしてインストールした場合
HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server\%InstanceName%\MSSQLServer
LoginMode
1: Windows 認証
2: 混合モード認証
正しい言語の選択
MSDE 2000 の既定のインスタンス
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer
MSDE 2000 の名前付きインスタンス
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\InstanceName
CurrentVersion
言語レジストリ値
16進 10進 そのインスタンスの言語
0x00000404 1028 中国語 (繁体字)
0x00000407 1031 ドイツ語
0x00000409 1033 英語
0x0000040a 1034 スペイン語
0x0000040c 1036 フランス語
0x00000410 1040 イタリア語
0x00000411 1041 日本語
0x00000412 1042 韓国語
0x00000413 1043 オランダ語
0x00000416 1046 ポルトガル語 (ブラジル)
0x0000041d 1053 スウェーデン語
0x00000804 2052 中国語 (簡体字)
バックアップと復元
インスタンスなし
osql -U sa -P password -n -Q "BACKUP DATABASE [databasename] TO DISK='c:\filename.bak'"
osql -U sa -P password -n -Q "RESTORE DATABASE [databasename] FROM DISK='c:\filename.bak'"
Windows 認証
osql -E -n -Q "BACKUP DATABASE [databasename] TO DISK='c:\filename.bak'"
osql -E -n -Q "RESTORE DATABASE [databasename] FROM DISK='c:\filename.bak'"
インスタンスあり
osql -U sa -P password -S servername -n -Q "BACKUP DATABASE [databasename] TO DISK='c:\filename.bak'"
osql -U sa -P password -S servername -n -Q "RESTORE DATABASE [databasename] FROM DISK='c:\filename.bak'"
Windows 認証
osql -E -S servername -n -Q "BACKUP DATABASE [databasename] TO DISK='c:\filename.bak'"
osql -E -S servername -n -Q "RESTORE DATABASE [databasename] FROM DISK='c:\filename.bak'"
資料
MSDEをセットアップする方法
MSDE システム管理者のパスワードを確認および変更する方法
[HOWTO] Osql ユーティリティを使用した SQL Server Desktop Engine (MSDE 2000) の管理方法
[HOWTO] Visual Studio .NET サーバー エクスプローラの使用方法
ADO で SQL Server のストアド プロシージャの値を取得する方法
OleDbConnection プロパティ
SQL Server 2000 Desktop Engine (MSDE 2000) のインストール時に強力な sa パスワードを指定する方法
セキュリティ更新プログラム 902400 をインストールした後に、 MS DTC トランザクション Internet Protocol 機能の構成方法
SQL Server をサポートする Windows のバージョンについて
PAE (物理アドレス拡張) 仕様を有効にした SQL Server 2000 を実行しているマルチプロセッサ コンピュータで予測できない現象が発生することがある
Windows Server 2003 コンピュータで実行されている SQL Server に Windows 認証を使用して接続できない場合がある
SQL Server パフォーマンス分析ユーティリティ Read80Trace および OSTRESS について
[INF] よく寄せられる質問 - SQL Server 2000 - アップグレード
よく寄せられる質問 - SQL Server 2000 - フェールオーバー クラスタリング
SQL Server 2000 で静的ポート割り当てと動的ポート割り当てを使用する方法
SQL Server のリンク サーバーおよび分散クエリで Excel を使用する方法
外部のタイムソースと時刻の誤差が生じる場合がある
[FIX] Windows Server 2003 を実行するコンピュータで SQL Server データベースのバックアップまたは復元を行うと一般的なネットワーク エラーが発生する
[プロトコルの暗号化を設定する] オプションが有効になっている場合の SQL Server における証明書の使用
[SQL] リンクサーバーへのクエリが失敗する場合がある
SQL Server CE 1.0 以降のクライアント プログラムが、Windows XP Service Pack 2 (SP2) を実行するコンピュータ上の IIS に接続できないことがある
[PRB] 報告されない入出力の問題を検出するために追加された新しい SQL Server 診断機能
[PRB] SQL Server エージェントが開始されず、エラー 18456 が表示される
Networkキーワード SQLインジェクション
データベースのバックアップとリカバリの克服
[INF] よく寄せられる質問 - SQL Server 2000 - セットアップ
SQL Server 2000 デモキット:Enterprise Manager 編
[BUG] SQL Server 2000 のダウンロード ファイルを抽出するとエラー メッセージ "ドライブ x:\ に十分な空き容量がありません" が表示される
SQL Server 2000 SP3 セキュリティ機能と推奨事例
SQL Server 一年生 - データベース基礎編 -
Books on SQL Server
MSDE 自習書 「MSDE を使おう」
SQL Server Web Data Administrator
PHP + MySQL
WindowsでPHPからストアドプロシージャ/ストアドファンクションを実行する
http://codezine.jp/article/detail/4575
GPS携帯を使った口コミサイト構築 - PHPによるメールの受信処理 -
http://codezine.jp/article/detail/4749