T SQL memo

@…変数
$…通常の文字。PL/SQLでは「.」が使えるが、T-SQLでは使えない。
  コンバート時に、この文字に置換される。


ssma_oracle.xxxxx … PL/SQLからコンバートした時、該当するファンクションが無
い時に付く接頭語。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【 @@変数 】

一部の Transact-SQL システム関数の名前には、2 つのアット マーク (@@) で始ま
るものがあります。
初期のバージョンの Microsoft SQL Server では、@@ 関数がグローバル変数と呼ば
れていましたが、これらは変数ではなく、変数とは違った動作をします。
@@ 関数はシステム関数であり、構文の用法は関数の規則に従います。

<システム関数>
https://msdn.microsoft.com/ja-jp/library/ms187786(v=sql.120).aspx

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【 @@FETCH_STATUS 】

https://docs.microsoft.com/ja-jp/sql/t-sql/functions/fetch-status-transact-sql
@@FETCH_STATUS … 接続によって現在オープンされているカーソルに対して最後に実
行した FETCH ステートメントの状態を返します。 

| 戻り値 | Description                                                      
       | 
|:-------|:------------------------------------------------------------------------|
|    0   | FETCH ステートメントは正常に実行されました。                     
       | 
|   -1   | FETCH ステートメントが失敗したか、または行が結果セットに収まりま
せん。  |
|   -2   | 取り出した行がありません。                                       
       | 
|   -9   | カーソルがフェッチ操作を実行しません。                           
       | 



@@CURSOR_ROWS  … 接続で最後にオープンされたカーソルに現在取得されている行数
を返します。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【 FETCH 】

https://docs.microsoft.com/ja-jp/sql/t-sql/language-elements/fetch-transact-sql
FETCH [カーソル名] INTO [変数リスト]

FETCH NEXT FROM [カーソル名] INTO [変数リスト]


| 戻り値 | Description                                                      
             | 
|:-------|:------------------------------------------------------------------------------|
| NEXT   | 規定。現在位置を返す。(仕様上の定義は、現在の行の直後にある行、
らしい。)    | 
| PRIOR  | 直前の行を返す。先頭行の位置は変更なし。                         
             |
| FIRST  | 取り出した行がありません。                                       
             | 
| LAST   | カーソルがフェッチ操作を実行しません。                           
             | 


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【 OPEN-CLOSE 】

DECLARE Employee_Cursor CURSOR FOR  

SELECT EmployeeID, Title FROM AdventureWorks2012.HumanResources.Employee; 


OPEN Employee_Cursor;  

FETCH NEXT FROM Employee_Cursor;  
WHILE @@FETCH_STATUS = 0  
   BEGIN  
      FETCH NEXT FROM Employee_Cursor;  
   END;  

CLOSE Employee_Cursor;  

DEALLOCATE Employee_Cursor;  
GO 


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【 DEALLOCATE 】
カーソルの割当てを削除する

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【 外部のストアドを実行 】

EXEC @return_value = PROCEDURE_NAME @arg1, @arg2, @arg3
※()とか書かない

EXEC SYSNAME.PROCEDURE_NAME @arg1 = @param1, @arg2 = @param2 OUTPUT
(※@param2 は OUTPUT)

戻り値が欲しい場合は、多分、こんな感じ。
EXEC PROCEDURE_NAME @arg1, @arg2, @arg3, @return_value
※@return_valueは、呼び出し先にて、「OUTPUT」が付与


こういう書き方でも可。
SELECT dbo.GetTestData('0001','0002','0003') AS RESULT

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【 例外処理 】

RAISERROR ([error_message], [severity], [state]); 

(使用例)
RAISERROR ('Error occurred!!!', 16, 1); 

------------------------------------------------------------------------
(エラーメッセージ例)
Msg 8134, Level 16, State 1, Procedure uspErrorMessageTest1, Line 5 Divide
by zero error encountered.

<エラーメッセージ(6つの部位から構成される)>
・ERROR_NUMBER
(Msg 8134)
50000 番以下は System Error Messages として定義されているので、
ユーザー定義のエラーを作る際は 50000 番より上の数字を選ぶ。

--[ ERROR_NUMBERの詳細は、以下で確認できる ]--
SELECT   *
FROM     sys.messages
WHERE    message_id = 8134
          AND language_id = 1033; -- 英語: 1033 / 日本語: 1041


・ERROR_SEVERITY
(Level 16)
 0~10  情報や警告程度のは重大ではないエラー。 TRY...CATCH を使った時に 10 
以下は CATCH に飛ばない。
11~16  ユーザーが訂正できる一般的なエラー。
17~24  リソースやハードウエア等の問題でアドミニストレーターが解決しなければ
ならないようなエラー。
20~25  重大なエラー。接続が切断される。
19~24  SQL Server のエラーログに出力される。
<詳細>
https://msdn.microsoft.com/ja-jp/library/ms164086(v=sql.120).aspx


・ERROR STATE
(State 1)
エラーが起こった状況を特定するためにアサインされているコードです。
(同じエラーでも起こる状況が違うケースがある)
Microsoft Knowledge Base を参照する時や、SQL Server のサポートエンジニアが問
題の箇所を特定する際に役立ちます。


・ERROR_PROCEDURE
(Procedure uspErrorMessageTest1)
エラーが起こったストアドプロシジャー名前です。 
エラーが起こったのがストアドプロシジャー内でない場合は何も返ってきません。


・ERROR_LINE
(Line 5 )
エラーが起こったライン番号です。


・ERROR_MESSAGE
(Divide by zero error encountered.)
起こったエラーの内容。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【 例外処理 】
※現在はこっちが推奨されている

THROW [error_number], [error_message], [state]; 

(使用例)
THROW 50000, 'Error!!!', 1; 

THROW の severity は常に 16 で、error_number には 50000 以上で 2147483647 以
下の整数を設定できます。 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

DECLARE @return_status int;  
EXEC @return_status = checkstate '2';  
SELECT 'Return Status' = @return_status;  
GO 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

begin try
 select 1/0 as DivideByZero
end try

begin catch
  throw;
end catch

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

create procedure uspErrorMessageTest1
as
begin
  select 1/0;
end
-------------------------------
exec uspErrorMessageTest1

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━