2016-03-30 3 views
0

Динамический 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 
+0

Не забывайте о том, что текст, содержащий зарезервированные символы 'LIKE' (например,' []% _ ') не может вести себя, как и ожидалось, когда перешел в @ noteText. – Lucero

ответ

1

Проблема в том, что SQL интерпретирует значение как строку, а не параметр. Итак, постройте шаблон. Вместо того, чтобы:

'ISNULL(title, '''') NOT LIKE ''%@noteText%''' 

использование:

'COALESCE(title, '''') NOT LIKE ''%'' + @noteText + ''%''' 
+0

Вы избили меня, но зачем заменить ISNULL COALESCE? Я не вижу здесь пользы. – Lucero

+0

работал отлично. спасибо – Jt2ouan

+0

@ Lucero. , Личное предпочтение. Я предпочитаю функции ANSI, когда они по существу эквивалентны. –