Mr.Tです、こんにちは。
おそらく自分がしらなかっただけ、なのかもしれませんので、メモ代わりとして。
なんの話かというと、あるテーブルに対してVarcharのフィールドを作成して、
Select文で条件をつけて抽出したとき、
こんなコードを書いたとすると、SQLServer2000までなら、上のSQLはエラーになる
はずです。intをvarcharにできませんとか、怒られてしまいます。
ところが、Microsoft SQL Server Management Studio Express上では、エラーになりません。
ええーーーー。
おんなじ結果やん。
シングルクォーテーションで囲わなくても結果がでてしまいます。
うそーん、とか言う前にじゃあ、どうやってやってるんだろ、と実行プランをみてみました。
下のやつが、シングルクォーテーションあり。
これが、シングルクォーテーションなし。通常ならエラーになるはずなのに...
うむ、予想通り、Convertしているではないか。
プロパティの述語の欄を参照だ。
CONVERT_IMPLICIT(int,[SGENKA].[dbo].[M_Section].[SectionCD],0)=CONVERT_IMPLICIT(int,[@1],0)
少々ぐぐってみる。
CONVERT_IMPLICIT SQLServer2005
まずは、PASSJのココ
http://www.sqlpassj.org/bbs/ml_disp.aspx?forum_id=0¤t_page=1&disp_mode=0&detail_mode=1&message_id=21762
中ほどよりも後半の部分に、
実行プランで「CONVERT_IMPLICIT」が発生していることがわかると思います。
この「CONVERT_IMPLICIT」は暗黙的型変換がおこなわれている証拠です。
これは Transact-SQL だけではなく、ADO.NET、ADO、ODBC、JDBC でも起こりうる現象
です。
クエリーのパラメータをカラムのデータ型に一致させていないと発生します。
クエリーが動くからいいという観点で開発していると暗黙的型変換が発生しているこ
とに気がつかずに、データ量が増えたときに「CONVERT_IMPLICIT」が足かせになって
パフォーマンスが出なくなることがありますので注意してください。
という記述があります。
つまり、暗黙の変換をしているわけですか。
で、もうちょっと見てみる。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PageIndex=1&SiteID=7&PageID=1&PostID=1485885
#もう去年の話題かよ(;;)
で、2008ではどうなんだろ。と思ったら、
[SQL Server 2008 CTP Febを入れてみた]
http://blogs.wankuma.com/kaya/archive/2008/02/27/125223.aspx
を思い出した。
おしえて、夏椰タン~
#いや、「おしえて、ダンコーガイ」ってやつをいってみたかったんだけど、ダンコーガイに
#SQLServerの話きいてもねー、と。