NOT LIKEの動的SQLは何らかの理由で渡されたパラメーターを受け入れません。これは、動的呼び出しにパラメータを渡さずに、単語を含む文字列を作成する場合に機能します。NOT LIKE動的SQLのSQLパラメーター
何らかの理由で、この呼び出しは、削除のNOT LIKEの@noteTextパラメータでは機能しません。 tempテーブルのすべてを削除します。 アポストロフィを持つ単語が、無効な文字列の引用に対して動的にエラーを発生させたときに渡されるときには、以下の作業が必要です。 (言葉がそれにアポストロフィを持っていない場合)、パラメータ@notetextと動的SQLは次のようになりますとき
declare @bsearchbody bit=1
declare @bsearchtitle bit =0
declare @notetext varchar(10)='that''s'
create table #matched(id int,note varchar(800),title varchar(800))
INSERT INTO #matched
select 1,'this is just a test. that''s fun.','test1'
UNION ALL
SELECT 2,' note on the ID','the is just a title'
UNION ALL
SELECT 3,'I watched basketball last night','basketball type'
declare @vchsql nvarchar(1000)=N'
DELETE from #matched
WHERE 1=1 AND (' + CASE WHEN @bSearchBody=1 THEN 'ISNULL(note,'''') NOT LIKE ''%@noteText%''' ELSE '' END +
CASE WHEN @bSearchBody=1 AND @bSearchTitle=1 THEN ' AND ' ELSE '' END +
CASE WHEN @bSearchTitle=1 THEN 'ISNULL(title,'''') NOT LIKE
''%@noteText%''' ELSE '' END +
')'
print @vchsql
exec sp_executesql @vchsql,N'@notetext varchar(10)',@notetext
スクリプトが動作します。
declare @bsearchbody bit=1
declare @bsearchtitle bit =0
declare @notetext varchar(10)='test'
create table #matched(id int,note varchar(800),title varchar(800))
INSERT INTO #matched
select 1,'this is just a test.','test1'
UNION ALL
SELECT 2,' note on the ID','the is just a title'
UNION ALL
SELECT 3,'I watched basketball last night','basketball type'
declare @vchsql nvarchar(1000)=N'
DELETE from #matched
WHERE 1=1 AND (' + CASE WHEN @bSearchBody=1 THEN 'ISNULL(note,'''') NOT LIKE ''%'+ @noteText+ '%''' ELSE '' END +
CASE WHEN @bSearchBody=1 AND @bSearchTitle=1 THEN ' AND ' ELSE '' END +
CASE WHEN @bSearchTitle=1 THEN 'ISNULL(title,'''') NOT LIKE ''%@noteText%''' ELSE '' END +
')'
print @vchsql
exec sp_executesql @vchsql,N'@notetext varchar(10)',@notetext
が期待通りに@に渡されたときに( '%_ []例えば、') 'LIKE'の予約文字を含むテキストが動作しないことを忘れないでくださいnoteText。 – Lucero