この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上で実行しています。