2016-03-30 90 views
0

NOT LIKE ile dinamik SQL, herhangi bir nedenle iletilen parametreyi kabul etmiyor. Parametre içinde dinamik çağrıya geçmez ve buradaki dizeyiSQL parametresi DEĞİL GİBİ dinamik sql

ile oluşturuyorsa, bu çağrı silme işleminin NOT LIKE'ındaki @noteText parametresi için çalışmadığından geçici masadan her şeyi silmeyi bitirir. Apostrophes sözcükleri, geçersiz bir dize teklifi için dinamik olarak atarlarken bina olarak iletildiğinde çalışmak için aşağıdakine ihtiyacım var. Parametre @notetext ve dinamik sql bu benzediği zaman (kelime içinde kesme işareti olmadığında)

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 

komut çalışır.

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

bir metin LIKE' 'saklıdır karakterleri içeren beklendiği gibi (örneğin' []% _ ') geçirilen davranır duruma geldiğinde unutmayın @ noteText. – Lucero

cevap

1

Sorun, SQL'in değeri bir parametreden ziyade bir dize olarak yorumlamasıdır. Yani deseni yap. Onun yerine:

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

kullanım:

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

Beni buna yendin - ama neden ISNULL'u COALESCE ile değiştirmelisin? Burada bir fayda görmüyorum. – Lucero

+0

mükemmel çalıştı. teşekkürler – Jt2ouan

+0

@ Lucero. . Kişisel tercih. Temelde eşdeğer olduklarında ANSI işlevlerini tercih ederim. –