¿Cómo escapo una cita simple en SQL Server?

957

Estoy tratando de insertingresar algunos datos de texto en una tabla en SQL Server9.

El texto incluye una comilla simple (').

¿Cómo puedo escapar de eso?

Intenté usar dos comillas simples, pero me arrojó algunos errores.

p.ej. insert into my_table values('hi, my name''s tim.');

tim_wonil
fuente
30
"me arrojó algunos errores" - ¿Cuáles fueron estos errores?
llamaoo7
Sí, porque la forma correcta de insertar comillas simples en MSSQL es duplicarlas. El ejemplo que nos muestres debería estar funcionando. ¿Cómo hacer esta consulta SQL, con qué idioma? ¿O está en SQL Server Management Studio?
MaxiWheat
1
Posible duplicado de Reemplazar comillas simples en SQL Server .
Peter Mortensen el

Respuestas:

1389

Las comillas simples se escapan al duplicarlas , tal como nos mostró en su ejemplo. El siguiente SQL ilustra esta funcionalidad. Lo probé en SQL Server 2008:

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

Resultados

value
==================
hi, my name's tim.
Cᴏʀʏ
fuente
16
Estaba buscando el lugar equivocado para solucionar mi problema. No era un problema de escape de personajes después de todo. mi problema fue que la longitud de los datos superó el límite. gracias por tranquilizarme de que usar la comilla simple dos veces es la forma correcta de escapar del personaje.
tim_wonil
Entonces, si tengo un texto que contiene 10k palabras, ¿será necesario que reemplace todo mi texto?
Vinicius Lima
3
@ViniciusLima: La respuesta corta es sí. Eso cambiaría, por supuesto, dependiendo de la tecnología que vaya a utilizar para almacenar los datos. Si está utilizando un ORM, lo hará por usted. Si está creando sus comandos SQL manualmente, querrá usar la funcionalidad de "declaraciones preparadas" del lenguaje. Si lo está haciendo en Management Studio, deberá reemplazarlo.
Cᴏʀʏ
1
es decir, dos comillas simples para una. [''] => [']
Ujjwal Singh
67

Si escapar de su cita simple con otra cita simple no funciona para usted (como no lo hizo para una de mis REPLACE()consultas recientes ), puede usarla SET QUOTED_IDENTIFIER OFFantes de su consulta, luego SET QUOTED_IDENTIFIER ONdespués de su consulta.

Por ejemplo

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again
Brad Waite
fuente
2
Normalmente uso el enfoque duplicado, pero cuando estaba generando SQL dinámico que luego se ejecutó en múltiples servidores y bases de datos, esta solución funcionó para mí, mientras que la duplicación no funcionó en un caso específico. ¡Gracias por esto!
Richard Moss
Tenga cuidado al hacer referencia a vistas e índices en columnas calculadas o puede obtener un error. stackoverflow.com/questions/9235527/…
datagod
@RichardMoss, +1. mismo escenario contigo. El enfoque doble es la solución inicial. Para consultas complejas como SQL dinámico en varios servidores, esto funcionará, es posible que el enfoque duplicado no lo haga
Edgar Allan Bayron
48

Qué tal si:

insert into my_table values('hi, my name'+char(39)+'s tim.')
PaulMcG
fuente
18
use char (39) en su lugar
Iswanto San
17

La duplicación de la cita debería haber funcionado, por lo que es peculiar que no haya funcionado para usted; sin embargo, una alternativa es usar comillas dobles, en lugar de simples, alrededor de la cadena. Es decir,

insert into my_table values("hi, my name's tim.");

Alex Martelli
fuente
44
¿Qué pasa si el texto contiene comillas simples y dobles? Además, ¿no se reservan las comillas dobles solo para los nombres de campo?
Lajos Meszaros
11

2 formas de solucionar esto:


ya 'que simplemente puede duplicarlo en la cadena, por ejemplo select 'I''m happpy', obtendrá:I'm happy


Para cualquier personaje del que no esté seguro: en el servidor sql puede obtener unicode de cualquier carácter select unicode(':')(mantenga el número)

Entonces este caso también puedes select 'I'+nchar(39)+'m happpy'

Xin
fuente
6

También otra cosa a tener en cuenta es si realmente se almacena como un ASCII clásico (ASCII 27) o Unicode 2019 (que se ve similar, pero no el mismo).

Esto no es un gran problema con las inserciones, pero puede significar el mundo en las selecciones y actualizaciones.
Si es el valor Unicode, entonces escapar de 'en una cláusula WHERE (por ejemplo, donde blah =' Compensación de los trabajadores ') devolverá como si el valor que está buscando no esté allí si' en 'Compensación de los trabajadores' es realmente el valor unicode.

Si su aplicación cliente admite claves libres, además de copiar y pegar entradas basadas, ¡podría ser Unicode en algunas filas y ASCII en otras!

Una manera simple de confirmar esto es haciendo algún tipo de consulta abierta que recuperará el valor que está buscando, y luego copie y pegue eso en notepad ++ o algún otro editor de soporte unicode.

La apariencia diferente entre el valor ASCII y el Unicode debería ser obvio para los ojos, pero si se inclina hacia el anal, aparecerá como 27 (ASCII) o 92 (Unicode) en un editor hexadecimal.

Daniel Schmidt
fuente
4

Muchos de nosotros sabemos que el método popular para escapar de las comillas simples es doblarlas fácilmente como a continuación.

PRINT 'It''s me, Arul.';

Duplicar el método de comillas simples

Vamos a ver algunas otras formas alternativas de escapar de las comillas simples.

1. Personajes de UNICODE

39 es el carácter UNICODE de Single Quote. Entonces podemos usarlo como a continuación.

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

Personajes de UNICODE

2.IDENTIFICADOR_COTADO

Otra solución alternativa simple y mejor es usar QUOTED_IDENTIFIER. Cuando QUOTED_IDENTIFIER se establece en OFF, las cadenas se pueden encerrar entre comillas dobles. En este escenario, no necesitamos escapar de comillas simples. Por lo tanto, de esta manera sería muy útil al usar muchos valores de cadena con comillas simples. Será muy útil al usar tantas líneas de scripts INSERT / UPDATE donde los valores de columna tienen comillas simples.

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

IDENTIFICADOR_CUITA

CONCLUSIÓN

Los métodos mencionados anteriormente son aplicables tanto a AZURE como a las instalaciones.

Arulmouzhi
fuente
1

La siguiente sintaxis le escapará SOLO UNA comilla:

SELECT ''''

El resultado será una cita simple. Puede ser muy útil para crear SQL dinámico :). ingrese la descripción de la imagen aquí

Popa Alin
fuente
0

Esto debería funcionar

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')
Dave Kelly
fuente
0

Simplemente inserte un 'antes de insertar cualquier cosa. Será como un personaje de escape en sqlServer

Ejemplo: cuando tienes un campo como, estoy bien . puede hacer: ACTUALIZAR my_table SET row = 'Estoy bien';

laxman Thapa
fuente
¿No es eso exactamente lo que hizo el OP, y lo mismo que dice la respuesta más votada? Presumiblemente debe haber habido alguna otra fuente del error.
Michael MacAskill
-3

Esto debería funcionar: use una barra diagonal inversa y ponga una comilla doble

"UPDATE my_table SET row =\"hi, my name's tim.\";
Chris Enitan
fuente
¿Qué quieres decir? ¿Estás diciendo que PRINT \"hi, my name's tim.\";va a funcionar en SSMS? No funciona en absoluto y nadie ha dicho que funcione.
Mohammad Musavi
Nunca funcionará
Santosh Jadi