2008-11-03 20 views
65

SQL Server'ın saklı yordamında bir dize kaçış nasıl LIKE ifade içinde kullanmak güvenlidir.SQL Server'da bir dize kaçış LIKE ifadesinde kullanmak güvenlidir

Bir NVARCHAR değişken şöyle var varsayalım:

declare @myString NVARCHAR(100); 

Ve ben bir LIKE ifadede kullanıldığında istiyorum: karakterleri ben daha spesifik (dize kaçmayı nasıl

... WHERE ... LIKE '%' + @myString + '%'; 

o T-SQL'de LIKE desen eşleştirmesi, örneğin % veya ? için anlamlıdır, bu şekilde kullanmak güvenli midir? Verilen örnek için

:

@myString = 'aa%bb' 

istediğim:

WHERE ... LIKE '%' + @somehowEscapedMyString + '%' 

maç için 'aa%bb', 'caa%bbc' ancak 'aaxbb' veya 'caaxbb'.

+0

Programlama dilinizi –

+0

içine koymadı. Programlama dili T-SQL'dir. –

cevap

81

LIKE ifadesindeki özel karakterlerden kurtulmak için bunları bir çıkış karakteri ile önbelleğe alırsınız. ESCAPE anahtar kelimesi ile hangi kaçış char anahtarını kullanacağınızı seçersiniz. (MSDN Ref) bu kaçış char olarak \ kullanarak,% sembolü kaçar Örneğin

:

select * from table where myfield like '%15\% off%' ESCAPE '\' 

Eğer dizede ne olacağını karakterleri bilmiyorum ve size istemiyorsanız Eğer, bir kaçış char tüm joker karakterler öneki, joker karakterler olarak ele örn:

set @myString = replace( 
       replace( 
       replace( 
       replace(@myString 
       , '\', '\\') 
       , '%', '\%') 
       , '_', '\_') 
       , '[', '\[') 

(siz de kaçış kömürü kaçmak zorunda olduğunu unutmayın ve böylece kaçamaz iç replace olduğundan emin ol Diğerleri ekledi replace ifadeleri). O zaman böyle bir şey kullanabilirsiniz:

select * from table where myfield like '%' + @myString + '%' ESCAPE '\' 

Ayrıca dize değiştirme ile daha uzun olacak gibi @myString değişken için daha fazla alan atamak unutmayın.

+0

Şu anda http://stackoverflow.com/questions/13861004/escaping-the-escape-character-does-not-work-sql-like-operator adresinde belirtilen yaklaşımı kullanıyorum Bu kodla ilgili herhangi bir eksiklik görüyor musunuz? – Lijo

+2

@ Lujo, bu iyi. Bu cevap C# 'dan kaçmakla birlikte, yukarıdaki cevap C# -belirli değil olarak SQL'de yapar. Her iki durumda da sonuç aynıdır: arama dizinizdeki özel karakterlerden kaçının ve LIKE komutunuzdaki ESCAPE anahtar sözcüğünü kullanın. – Rory

+0

Ayrıca, tek bir alıntıdan ('\' 'ile değil, iki tek tırnak ile değiştirerek) kurtulmanız gerektiğini düşünüyorum. –

5

Çıkış karakterini siz belirlersiniz. Buradaki belgeler:
http://msdn.microsoft.com/en-us/library/ms179859.aspx

+1

Ben zaten bir LIKE ifadesinde kaçması gereken neyse bir şey için diliyordum. –

+0

Yanıt, kendi kaçış karakterinizi belirlemenizi önerdi, dolayısıyla "anlamlı" karakterler artık anlamlı olmayacak. – Goran

3

Kaçış karakteri içeren dizeleri aramak ister misiniz? Örneğin, bunu istiyorsanız:

select * from table where myfield like '%10%%'. 

Tüm alanları% 10 ile aramak istediğiniz yer? Bu durumda, bir çıkış karakteri belirlemek ve joker karakteri kaçmak için ESCAPE yan tümcesi kullanabilirsiniz.

select * from table where myfield like '%10!%%' ESCAPE '!' 
+0

Soruna istediğimin bir örneğini ekledim. –

16

Benzer bir sorun (NHibernate kullanarak, ESCAPE anahtar sözcüğünü kullanmak çok zor olurdu) ve köşeli parantez karakterlerini kullanarak çözdüm.

create table test (field nvarchar(100)) 
go 
insert test values ('abcdef%hijklm') 
insert test values ('abcdefghijklm') 
go 
select * from test where field like 'abcdef[%]hijklm' 
go 
+0

Bu en iyi cevaptır. Kaçmaya güvenmiyor ve tüm dizeler için çalışıyor. – John

+0

Bence bu, askerin aradığı şeylere en basit ve en yakın olanı. ESCAPE'nin bazı durumlarda yararlı olmadığını söylemek yanlıştır. – bitoolean

12

yerine bir lider joker kullanarak göz önüne alındığında desen sözdiziminde belirli öneme sahip bir dizede tüm karakterleri kaçan: Eğer kanıt gerekiyorsa Yani örnek

WHERE ... LIKE '%aa[%]bb%' 

olacak desende sadece yapmak daha hızlı ve kolaydır. o YourColumn üzerinde bir dizin kullanamazsınız gibi bir yaklaşım yukarıda lider joker kullanmayan durumlarda

SELECT * 
FROM YourTable 
WHERE CHARINDEX(@myString , YourColumn) > 0 

ancak kaçınılmalıdır. Optimum uygulama planı both CHARINDEX ve the ESCAPE keyword göre sözdizimi kaçan kare tutucu ile LIKE kullanıldığında tahminler daha iyi olabilir eşleşen satır sayısına göre değişir durumlarda ek

.

+0

Mükemmel! Peki ya önde gelen vahşi kart yoksa? – Colin

+1

@Colin - Eğer lider joker olmasaydı ve hedef dizideki herhangi bir joker karakterden kaçmak ise o zaman sadece '=' kullanabilirsiniz. Kaçan özel karakterler yanıtları, belirli bir değerle başlayan değerleri arayan bir sorgu için hala yararlı olabilir, ancak "LIKE" bu durumda bir dizin kullanabilir ancak "CHARINDEX" bunu yapamaz. –