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