Carácter de escape en SQL Server

95

Quiero usar una cita con carácter de escape. ¿Como lo puedo hacer?

He recibido un error en SQL Server

Comillas sin cerrar después de la cadena de caracteres.

Estoy escribiendo una consulta SQL en una varcharvariable pero he recibido ese error:

Comillas sin cerrar después de la cadena de caracteres.

Quiero usar comillas como carácter de escape.

e al cuadrado
fuente
4
Puede usted por favor mostrar nosotros la consulta ??
marc_s

Respuestas:

79

Para escapar 'simplemente necesitas poner otro antes:''

Como muestra la segunda respuesta, es posible escapar de las comillas simples como esta:

select 'it''s escaped'

el resultado será

it's escaped

Si está concatenando SQL en un VARCHAR para ejecutar (es decir, SQL dinámico), le recomendaría parametrizar el SQL. Esto tiene el beneficio de ayudar a protegerse contra la inyección de SQL y significa que no tiene que preocuparse por escapar de las citas como esta (lo que hace al duplicar las citas).

por ejemplo, en lugar de hacer

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = ''AAA'''
EXECUTE(@SQL)

prueba esto:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'
AdaTheDev
fuente
30
¿Por qué es esta la respuesta aceptada? No responde a la pregunta.
Peter Moore
3
@PeterMoore O el OP habría usado la primera parte de mi respuesta (duplicando las comillas, según otras respuestas a continuación), o habría usado el enfoque preferido que recomendé para construir una consulta SQL en una variable de cadena: usar parametrizado SQL. De cualquier manera, ambos son respuestas a la pregunta
AdaTheDev
No responde a la pregunta. A veces, el usuario necesita una conexión ODBC, lo que significa que solo puede usar SQL puro.
Tony
Respuesta editada para que sea más clara y se ajuste mejor a la pregunta
Anterior
123

Puede escapar de una cita como esta:

select 'it''s escaped'

el resultado será

it's escaped
dugokontov
fuente
Esta debería ser la respuesta.
Tony
46

Puede definir su carácter de escape, pero solo puede usarlo con una LIKEcláusula.

Ejemplo:

SELECT columns FROM table
WHERE column LIKE '%\%%' ESCAPE '\'

Aquí buscará %en una cadena completa y así es como se puede usar el ESCAPEidentificador en SQL Server.

Aniket A
fuente
21

Solo necesitas reemplazar 'con el ''interior de tu cuerda

SELECT colA, colB, colC
FROM tableD
WHERE colA = 'John''s Mobile'

También puede usar REPLACE(@name, '''', '''''')si genera el SQL dinámicamente

Si desea escapar dentro de una declaración similar, debe usar la sintaxis ESCAPE

También vale la pena mencionar que se está dejando abierto a ataques de inyección SQL si no lo considera. Más información en Google o: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F

Seph
fuente
y, sin embargo, las respuestas de dugokontov o RichardPianka no tienen un -1 similar?
Seph
@MichaelMunsey Pruébelo usted mismo: select 'devuelve el error Unclosed quotation mark after the character string ''. En ninguna parte de mi respuesta utilizo "solo dos ', no estoy seguro de por qué la mía es la única respuesta con votos negativos.
Seph
12

El escape de las comillas en MSSQL se realiza mediante comillas dobles, por lo que a ''o a ""producirán un escape 'y ", respectivamente.

Richard Pianka
fuente
0

Puede usar el **\**carácter antes del valor del que desea escapar, por ejemplo insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'

terrícola paradoja
fuente
0

Si desea escapar de la entrada del usuario en una variable, puede hacer lo siguiente dentro de SQL

  Set @userinput = replace(@userinput,'''','''''')

El @userinput ahora se escapará con una cotización única adicional por cada aparición de una cotización

Nayajiv
fuente
0
WHERE username LIKE '%[_]d';            -- @Lasse solution
WHERE username LIKE '%$_d' ESCAPE '$';
WHERE username LIKE '%^_d' ESCAPE '^';

DE: SQL Server Escape un subrayado

R.Alonso
fuente
-2

Para que el código sea fácil de leer, puede usar corchetes []para citar la cadena que lo contiene 'o viceversa.

Ben
fuente
Esto es incorrecto. Los corchetes funcionan con caracteres ilegales en los nombres de campo, tabla o esquema.
Jamie Marshall
Sí, tienes razón, es para los nombres de los objetos, no para el contenido de las cadenas. Debo leer mal la pregunta.
Ben