2009-09-15 11 views
12

Sto cercando qualcosa che funzioni in SQL Server simile al simbolo @ in C# che fa sì che una stringa venga presa come se fosse letterale. Ad esempio:Come uscire da una stringa da utilizzare con l'operatore LIKE in SQL Server?

string text = "abcd\\efg"; 
Output of text = abcd\efg 

string text = @"abcd\\efg"; 
Output of text = abcd\\efg 

Si noti come il @ influenzato la stringa di prendere ogni personaggio così com'è.

Ora non sono sicuro che sia possibile, ma qui è il mio problema e forse c'è un modo migliore per risolvere questo problema. Si consideri la seguente query di base:

SELECT [Name] 
    FROM [Test] 
WHERE [Name] LIKE (@searchText + '%') 

Il mio problema è che se hanno messo un %, _ o qualsiasi altro di quei personaggi speciali che possono influenzare la mia clausola LIKE. Voglio che la partita funzioni come una funzione 'inizia con'. Quindi c'è qualcosa che posso applicare a @searchText per dire prendi questo alla lettera o è possibile trovare una soluzione migliore a cui non sto pensando?

Modifica: Non voglio che la soluzione sia la pulizia lato client. Ho bisogno che questo processo memorizzato funzioni senza fare affidamento sui dati passati in fase di pulizia.

+1

Per evitare confusione, il problema qui è l'escaping di una stringa da utilizzare con l'operatore LIKE. – recursive

+0

Vedi anche: http://stackoverflow.com/questions/439495/tsql-like-escape-clause – recursive

+0

Grazie ricorsivo, aggiornerò il titolo corrispondente. – Kelsey

risposta

16

Per verificare la " % "come letterale non carattere jolly n una stringa, ha bisogno di essere salvata come [%].

Ora, SQL Server solo bisogno di 3 personaggi in fuga:% _ [

Quindi, creare un'UDF scalare per avvolgere questo:

REPLACE(REPLACE(REPLACE(@myString, '[', '[[]'), '_', '[_]'), '%', '[%]') 

Grazie alla semplicità (aka: molto limitata) pattern matching in SQL, non è necessario nulla di più complesso ...

+0

Questo codice funziona. Grazie per il frammento e l'esplosione. – Kelsey

+0

Grazie, questo ha risolto il mio problema dopo una lunga ricerca. – nRk

0

Ogni carattere da trattare alla lettera deve essere racchiuso tra parentesi quadre. Una parentesi destra viene presa letteralmente direttamente, quindi non racchiuderla.

-1

Mi piacerebbe sterilizzare la stringa nell'applicazione front-end piuttosto che provare a fare cose di tipo hokey in SQL per ovviare a questo problema.

+0

Penso che sia il piano. – recursive

+0

Cosa succede se in realtà hai bisogno di segni di percentuale o caratteri di sottolineatura nel testo? –

+3

Non voglio che il mio stored proc faccia affidamento sul chiamante passandogli dati puliti. – Kelsey

9

In TSQL, è possibile racchiudere tra parentesi i caratteri% e _ come [%] [_] ciò indica a SQL di considerarli come valori letterali.

Ho testato e verificato questo funziona in SQL Server 7.0, 2000 e 2005.

http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx

+0

Così facendo "... dove columnName LIKE '[%] foo%'" cercherebbe effettivamente qualsiasi valore che inizia con "% foo" (il% si comporta come un letterale, non come un carattere jolly? Non ne ero a conoscenza –

+0

Questo non vale per le stringhe letterali – David

+1

Ah, sono corretto, non l'ho mai visto usato in 10 anni. :-P – David

-1

Se non si desidera modificare il testo in ingresso, è possibile utilizzare il "LEFT "la funzione di creare il proprio 'StartsWith':

SELECT [Name] 
    FROM [Test] 
WHERE @searchText = LEFT([Name], LEN(@searchText)) 

(. si noti che probabilmente avete bisogno di fare lavoro extra per gestire il caso di NULL o stringa vuota)

MODIFICA: ha rimosso l'istruzione errata sull'utilizzo di "LIKE" per cercare "%".

+0

Sembra essere un equivoco molto comune, ma puoi sfuggire a% e _ in LIKE confronti –

0

Se si parametrizza la query, non è necessario preoccuparsene.

UPDATE

Come ricorsiva indicato nei commenti,% deve ancora essere sfuggito anche in query con parametri, non mi rendevo conto LINQ to SQL è stato farlo automagically quando ho provato.

È possibile utilizzare ESCAPE 'x' dove x è il carattere che si desidera sia il carattere di escape.LINQ to SQL lo fa in questo modo

WHERE [Nome] Come @searchText ESCAPE '~'

dove @searchText = [del testo con un carattere ~%%]

o come altri hanno dichiarato che può essere sfuggito con [%]

view the documentation

+0

Questo non è vero. Prova tu stesso. – recursive

+0

La domanda nell'OP non è correlata alle query con parametri. La domanda è valida con o senza parametri –

+0

Non ne ero a conoscenza. Da Linq a SQL lo fa automaticamente. Ho corretto la mia risposta. –

-1

Da the docs:

.210

Sintassi

match_expression [NOT] Come modello [Escape escape_character]

Utilizzare l'opzione ESCAPE in questo modo:

SELECT [Name] 
    FROM [Test] 
WHERE [Name] LIKE (REPLACE(@searchText, '%', '%%') + '%') ESCAPE '%' 
+0

Ho pensato a questa rotta, ma dovrei farlo per%, _, [,] e altri caratteri? Sembra un sacco di ricerca e sostituzione. – Kelsey