2009-09-15 17 views
12

Estoy buscando algo que funcione en SQL Server similar al símbolo @ en C# que hace que se tome una cadena ya que es literal. Por ejemplo:¿Cómo escapar de una cadena para usar con el operador LIKE en SQL Server?

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

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

Observe cómo el @ afectó a la cuerda para tomar cada carácter como está.

Ahora no estoy seguro de que esto sea posible, pero este es mi problema y quizás haya una mejor manera de resolverlo. Considere la siguiente consulta básica:

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

Mi problema es si ponen un %, _ o cualquier otro de esos caracteres especiales que pueden afectar a mi cláusula similares. Quiero que el partido actúe como una función 'comienza con'. Entonces, ¿hay algo que pueda aplicar al @searchText para decir que tomo esto literalmente o existe una mejor solución en la que no estoy pensando?

Edit: No quiero que la solución sea la limpieza del lado del cliente. Necesito que este proceso almacenado funcione sin depender de los datos que se pasan al limpiarse.

+1

Para evitar confusiones, el problema aquí es escapar de una cadena para usar con el operador LIKE. – recursive

+0

Vea también: http://stackoverflow.com/questions/439495/tsql-like-escape-clause – recursive

+0

Gracias recursivo, voy a actualizar el título para que coincida. – Kelsey

Respuesta

16

Para buscar " % "como un comodín literal no i En una cadena, necesita escapar como [%].

Ahora, SQL Server sólo necesita 3 personajes que escapan:% _ [

Por lo tanto, crear una UDF escalar a terminar con esto:

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

Debido a la simplicidad (también conocido como: muy limitado) la coincidencia de patrones en SQL, no se necesita nada más complejo ...

+0

Este código funciona. Gracias por el fragmento y la explicación. – Kelsey

+0

Gracias, esto resolvió mi problema después de una larga búsqueda. – nRk

0

Cada carácter que debe tratarse literalmente debe incluirse entre corchetes. Un corchete derecho se toma literalmente directamente, así que no encierre ese.

-1

Yo desinfectaría la cadena en la aplicación de front-end en lugar de tratar de hacer hokey cosas en SQL para solucionar esto.

+0

Creo que ese es el plan. – recursive

+0

¿Qué sucede si REALMENTE necesita signos de porcentaje o guiones bajos en el texto? –

+3

No quiero que mi proceso almacenado dependa de que la persona que llama le pase los datos limpios. – Kelsey

9

En TSQL, puede ajustar los caracteres% y _ entre corchetes, por lo que [%] [_] esto le indica a SQL que los trate como literales.

he probado y verificado esto funciona en SQL Server 7.0, 2000 y 2005.

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

+0

Entonces, hacer "... donde columnName LIKE '[%] foo%'" realmente buscaría cualquier valor que comience con "% foo" (el% actuando como un literal, no como un comodín? No estaba al tanto de eso –

+0

Esto no es cierto para los literales de cadena – David

+1

Ah, estoy corregido. Nunca he visto esto usado en 10 años. :-P – David

-1

Si no desea modificar el texto entrante, puede utilizar la "IZQUIERDA "función para crear su propia 'startsWith':

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

(. Tenga en cuenta que es probable que tenga que hacer trabajo extra para manejar el caso de valores NULL o cadena vacía)

EDITAR: Se eliminó la declaración incorrecta sobre el uso de "LIKE" para buscar "%".

+0

Parece ser una idea errónea muy común, pero PUEDE escapar% y _ en las comparaciones LIKE –

0

Si parametriza su consulta, no tiene que preocuparse por ello.

ACTUALIZACIÓN

Como recursiva se indica en los comentarios,% todavía necesita ser escapado incluso en consultas con parámetros, no me daba cuenta de LINQ to SQL estaba haciendo automágicamente cuando probé.

Puede usar ESCAPE 'x' donde x es el caracter que desea que sea el caracter de escape.LINQ a SQL hace como este

DONDE [Nombre] COMO @searchText ESCAPE '~'

donde @searchText = [un texto con un carácter% ~%]

o como otros han dicho, se puede escapar con [%]

view the documentation

+0

Esto no es verdad. Inténtalo tú mismo. – recursive

+0

La pregunta en el PO no está relacionada con consultas parametrizadas. La pregunta es válida con o sin los parámetros –

+0

No estaba al tanto de eso. Linq to SQL lo hace automáticamente. He corregido mi respuesta. –

-1

de the docs:

Sintaxis

MATCH_EXPRESSION [NO] Al igual que patrón [Escape escape_character]

Utilice la opción ESCAPE así:

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

Pensé en esta ruta, pero ¿tendré que hacer esto para%, _, [,] y para cualquier otro personaje? Parece mucho buscar y reemplazar. – Kelsey

Cuestiones relacionadas