2009年3月18日水曜日

[SQL_Server] システムSP: sp_executesql での注意点。

 Stored Procedure で動的に Query を生成・実行したいトキは多々ある。
 ので、よく使うシステム Stored Procedure がある。

 それが『 sp_executesql 』。

 ところが。
 これの細かい仕様を理解せずに今まで使用しておりました。
 Stored を組み始めて・・・早数ヶ月。お恥ずかしい。

 [ sp_executesql ] のパラメーターは大雑把に ( 詳細はBOL参照 )
   @stmt ( SQL ステートメント: 必須 )
,@params ( @stmt で使用するパラメーター変数定義(型 , IN / OUT ) : 既定値 NULL )
,@param1 ( @params の値設定 : 既定値 NULL )

 で、第一引数の「@stmt」に注意があったんですよ。
 今日、BOL をきちんと読んだら書いてあった。

 --*--*--*--*--*
 ~。+ 演算子で 2 つの文字列を連結するなどの複雑な Unicode 式は使用できません。
 --*--*--*--*--*

 あたしはコレを知らず。
 「@stmt」の型は 『NVARCHAR(MAX)』だけど、「+ 演算子で 2 つの文字列を連結する」と、どうもストレージを最大に使えないんだかなんだか、文字列が切り詰められちゃう。
 ( N''プレフィックスをつけると 4000 文字位。つけないと 8000文字位 )

 で、Query が不完全になってエラーを発すると。。。

 そんなワケで、『NVARCHAR(MAX)』って『NVARCHAR(4000)』と変わらない??
 と勘違いしていました。
 無知っておそろしい。つくづく。

 ちなみに、『NVARCHAR(MAX)』のサイズ説明は BOL には下記のようにあります。(抜粋)
 --*--*--*--*--*
 max はストレージの最大サイズが 2^31-1 バイトであることを示しています。
 ストレージのサイズは、入力文字数の 2 倍のバイト数に 2 バイトを足した数です。
 --*--*--*--*--*
 単純に計算して・・・536870911 文字??
 ( 計算苦手なんで違うかも )


 今更だけど、知ってよかった。で、メモ。

 
 
 
 

0 件のコメント: