2015年2月22日日曜日

sp_executesqlによる動的クエリーにおける、LIKEの書き方について

今回の記事では、SQL-Server EXPRESS 2014上にて、sp_executesqlによる動的クエリーにおける、LIKE文の書き方について書かせて頂きたいと思います。

このsp_executesqlは、単に動的SQLが実行出来る、というだけではなく、パラメータが使えるのが特に大きな美点。

ただし、少し癖があって、LIKEを使った検索なんかだと素直に LIKE'%検索キーワード%'などと書くと動きません。

私は最初「アアレッ??」となってビビッてしまいましたが、色々やってみたら、以下のように書けば動くんですね。



DECLARE @SQL NVARCHAR(MAX),@PRM NVARCHAR(MAX);

SET @SQL = 
N'SELECT T.* ' + 
N'FROM (SELECT ' +  
N'      [国名], ' +
N'      [メーカー], ' +
N'      [名前], ' +
N'      [国名]+[メーカー]+[名前] COLLATE Japanese_CI_AS AS [検索] ' + 
N'      FROM MAINDB.dbo.T001) AS T ' +
N'WHERE [検索] LIKE ''%''+@S1+''%'' ' + 
N'  AND [検索] LIKE ''%''+@S2+''%'' ' +
N'  AND [検索] LIKE ''%''+@S3+''%'' ';

SET @PRM = '@S1 NVARCHAR(MAX),@S2 NVARCHAR(MAX),@S3 NVARCHAR(MAX)';

EXEC master.dbo.sp_executesql
@SQL,
@PRM,
@S1='日本',
@S2='シャープ',
@S3='グリーン';

つまり、'%@パラメータ%'ではなくて、
'%' + @パラメータ + '%' というのがポイントでした。


ちなみに、以下のような書き方をしても動きます。



SET @SQL = 
N'SET @S1 = ''%''+@S1+''%'' ' +
N'SET @S2 = ''%''+@S2+''%'' ' +
N'SET @S3 = ''%''+@S3+''%'' ' + 
N'SELECT T.* ' + 
N'FROM (SELECT ' +  
N'      [国名], ' +
N'      [メーカー], ' +
N'      [名前], ' +
N'      [国名]+[メーカー]+[名前] COLLATE Japanese_CI_AS AS [検索] ' + 
N'      FROM MAINDB.dbo.T001) AS T ' +
N'WHERE [検索] LIKE @S1 ' + 
N'  AND [検索] LIKE @S2 ' +
N'  AND [検索] LIKE @S3 ';

ちなみに今回はWindows10ではなくて、Windows 7上で実行しています。