Como escapar de uma única citação no SQL Server?


957

Estou tentando insertalguns dados de texto em uma tabela no SQL Server9.

O texto inclui uma aspas simples (').

Como escapar disso?

Tentei usar duas aspas simples, mas isso me causou alguns erros.

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


30
"isso me deu alguns erros" - Quais foram esses erros?
Llamaoo7

Sim, porque a maneira correta de inserir aspas simples no MSSQL é dobrá-las. O exemplo que você nos mostra deve estar funcionando. Como você faz essa consulta SQL, com qual idioma? Ou é no SQL Server Management Studio?
MaxiWheat 19/10/2009

Respostas:


1389

As aspas simples são escapadas dobrando-as , assim como você nos mostrou em seu exemplo. O SQL a seguir ilustra essa funcionalidade. Eu testei no 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.

16
Eu estava olhando para o lugar errado para resolver meu problema. afinal, não era uma questão de fuga de personagem. meu problema era que o comprimento dos dados estava acima do limite. obrigado por me tranquilizar dizendo que usar as aspas simples duas vezes é a maneira certa de escapar do personagem.
21190 tim_wonil

Então, se eu tiver um texto contendo 10 mil palavras, será necessário substituir todo o meu texto?
Vinicius Lima

3
@ViniciusLima: A resposta curta é sim. Isso mudaria de rumo, dependendo da tecnologia que você usará para armazenar os dados. Se você estiver usando um ORM, ele fará isso por você. Se você estiver criando seus comandos SQL manualmente, desejará usar a funcionalidade "instruções preparadas" da linguagem. Se você estiver fazendo isso no Management Studio, precisará fazer a substituição.
Cᴏʀʏ

1
ou seja, duas aspas simples para uma. [''] => [']
Ujjwal Singh 28/04

67

Se escapar de uma citação única com outra citação única não estiver funcionando para você (como não ocorreu em uma das minhas REPLACE()consultas recentes ), você poderá usar SET QUOTED_IDENTIFIER OFFantes da sua consulta e SET QUOTED_IDENTIFIER ONdepois da sua consulta.

Por exemplo

SET QUOTED_IDENTIFIER OFF;

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

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
Normalmente eu uso a abordagem dobrada, mas onde eu estava gerando SQL dinâmico, que era executado em vários servidores e bancos de dados, essa solução funcionou para mim, enquanto a duplicação não ocorreu em um caso específico. Obrigado por isso!
Richard Moss

Tenha cuidado ao fazer referência a visualizações e índices em colunas computadas ou poderá ocorrer um erro. stackoverflow.com/questions/9235527/…
datagod 9/17

@RichardMoss, +1. mesmo cenário com você. abordagem dobrada é a solução inicial. Para consultas complexas como SQL dinâmica em vários servidores, este trabalho vontade, dobrou abordagem não pode
Edgar Allan Bayron


17

A duplicação da cotação deveria ter funcionado, por isso é peculiar que não funcionou para você; no entanto, uma alternativa é usar caracteres de aspas duplas, em vez de caracteres simples, ao redor da string. Ou seja,

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


4
E se o texto contiver aspas simples e duplas? Além disso, as aspas duplas não são reservadas apenas para nomes de campo?
Lajos Meszaros 28/11

11

2 maneiras de contornar isso:


pois 'você pode simplesmente dobrá-lo na string, por exemplo select 'I''m happpy'- receberá:I'm happy


Para qualquer personagem que você não tem certeza: no servidor sql, você pode obter o unicode de qualquer caractere select unicode(':')(mantenha o número)

Então, neste caso, você também pode select 'I'+nchar(39)+'m happpy'


6

Outro aspecto a ter cuidado é se ele é realmente armazenado como um ASCII clássico '(ASCII 27) ou Unicode 2019 (que parece semelhante, mas não é o mesmo).

Isso não é muito importante em inserções, mas pode significar o mundo em seleções e atualizações.
Se esse for o valor unicode, o escape da cláusula 'in a WHERE (por exemplo, onde blah =' Workers''s Comp ') retornará como o valor que você está procurando, se o' in "Worker's Comp" for realmente o valor unicode.

Se o seu aplicativo cliente suportar entrada livre de chave, além de copiar e colar, pode ser Unicode em algumas linhas e ASCII em outras!

Uma maneira simples de confirmar isso é fazer algum tipo de consulta aberta que trará de volta o valor que você está procurando e copie e cole-o no bloco de notas ++ ou em outro editor de suporte a Unicode.

A aparência diferente entre o valor ascii e o unicode deve ser óbvia para os olhos, mas se você se inclinar para o anal, ele aparecerá como 27 (ascii) ou 92 (unicode) em um editor hexadecimal.


4

Muitos de nós sabemos que o método popular de escapar de aspas simples é dobrá-las facilmente como abaixo.

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

Dobrar o método de aspas simples

vamos procurar outras maneiras alternativas de escapar das aspas simples.

Caracteres UNICODE

39 é o caractere UNICODE de aspas simples. Para que possamos usá-lo como abaixo.

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

Personagens UNICODE

2.QUOTED_IDENTIFIER

Outra solução alternativa simples e melhor é usar QUOTED_IDENTIFIER. Quando QUOTED_IDENTIFIER está definido como OFF, as seqüências de caracteres podem ser colocadas entre aspas duplas. Nesse cenário, não precisamos escapar de aspas simples. Portanto, dessa maneira, seria muito útil ao usar muitos valores de string com aspas simples. Será muito útil ao usar tantas linhas de scripts INSERT / UPDATE em que os valores das colunas têm aspas simples.

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

QUOTE_IDENTIFIER

CONCLUSÃO

Os métodos acima mencionados são aplicáveis ​​ao AZURE e On Premises.


1

A seguinte sintaxe escapará de você APENAS UMA aspas:

SELECT ''''

O resultado será uma citação única. Pode ser muito útil para criar SQL dinâmico :). insira a descrição da imagem aqui


0

Isso deve funcionar

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

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

0

Basta inserir um 'antes de qualquer coisa a ser inserida. Será como um caractere de escape no sqlServer

Exemplo: Quando você tem um campo como, eu estou bem . você pode fazer: UPDATE my_table SET row = 'Estou bem.';


Não foi exatamente isso que o OP fez e o mesmo que a resposta mais votada já diz? Presumivelmente, deve ter havido alguma outra fonte do erro.
Michael MacAskill

-2

Isso deve funcionar: use uma barra invertida e coloque aspas duplas

"UPDATE my_table SET row =\"hi, my name's tim.\";

O que você quer dizer? Você está dizendo que isso PRINT \"hi, my name's tim.\";vai funcionar no SSMS? Não funciona e ninguém nunca disse que funciona.
Mohammad Musavi

Nunca vai funcionar.
Santosh Jadi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.