Динамический SQL с NOT LIKE не принимает переданный параметр по какой-либо причине. Он работает, если я не передаю параметр динамическому вызову и скорее строит строку со словом в ней.Параметр SQL в NOT LIKE dynamic sql
По какой-то причине этот вызов не работает для параметра @noteText в NOT LIKE удаления и заканчивается удалением всего из таблицы temp. Мне нужно, чтобы нижеследующее работало, когда слова с апострофами передавались, поскольку он динамически генерирует ошибки для недопустимой строковой цитаты.
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
Скрипт работает, когда @notetext параметр и динамический SQL выглядит следующим образом (если слово не имеет апостроф в нем).
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