Caractere de escape no SQL Server

93

Quero usar citação com caractere de escape. Como eu posso fazer?

Recebi um erro no SQL Server

Aspas não fechadas após a sequência de caracteres.

Estou escrevendo uma consulta SQL em um varchar variável, mas recebi esse erro:

Aspas não fechadas após a sequência de caracteres.

Quero usar aspas como caractere de escape.

e quadrado
fonte
4
Você pode nos mostrar a consulta ??
marc_s
2
Possível duplicata de Como escapar de aspas simples no SQL Server?
Jens Schauder

Respostas:

72

Para escapar 'você simplesmente precisa colocar outro antes:''

Como mostra a segunda resposta, é possível escapar das aspas simples assim:

select 'it''s escaped'

resultado será

it's escaped

Se você estiver concatenando SQL em um VARCHAR para executar (ou seja, SQL dinâmico), recomendo parametrizar o SQL. Isso tem o benefício de ajudar na proteção contra a injeção de SQL e ainda significa que você não precisa se preocupar em escapar aspas como esta (o que você faz dobrando as aspas).

por exemplo, em vez de fazer

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

tente isto:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'
AdaTheDev
fonte
29
Por que essa é a resposta aceita? Não responde à pergunta.
Peter Moore
3
@PeterMoore Ou o OP teria usado a 1ª parte da minha resposta (dobrando as aspas, conforme outras respostas abaixo), ou teria usado a abordagem preferida que eu recomendei para construir uma consulta SQL em uma variável de string - para usar parametrizada SQL. De qualquer forma, ambas são respostas para a pergunta
AdaTheDev
Não responde à pergunta. Às vezes, o usuário precisa de uma conexão ODBC, o que significa que você só pode usar SQL puro.
Tony
Resposta editada para mais clara e mais adequada à pergunta
Revious,
121

Você pode escapar da citação assim:

select 'it''s escaped'

resultado será

it's escaped
Dugokontov
fonte
Esta deve ser a resposta.
Tony
43

Você pode definir seu caractere de escape, mas só pode usá-lo com uma LIKEcláusula.

Exemplo:

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

Aqui ele pesquisará por %toda a string e é assim que se pode usar o ESCAPEidentificador em SQL Server.

Aniket A
fonte
21

Você precisa apenas substituir 'por ''dentro de sua corda

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

Você também pode usar REPLACE(@name, '''', '''''') se gerar o SQL dinamicamente

Se você quiser escapar dentro de uma instrução like, você precisa usar a sintaxe ESCAPE

Também vale a pena mencionar que você está se deixando vulnerável a ataques de injeção de SQL se não considerar isso. Mais informações no Google ou: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F

Seph
fonte
e ainda as respostas de dugokontov ou RichardPianka não têm nenhum -1 semelhante?
Seph
@MichaelMunsey tente você mesmo: select 'retorna o erro Unclosed quotation mark after the character string ''. Em nenhuma parte da minha resposta utilizo "apenas duas ', não tenho certeza de por que a minha é a única resposta com votos negativos.
setembro de
12

As aspas de escape no MSSQL são feitas por aspas duplas, portanto, a ''ou a ""produzirá uma com escape 'e ", respectivamente.

Richard Pianka
fonte
0

Você pode usar o **\**caractere antes do valor que deseja escapar, por exemplo insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'

paradoxo terrestre
fonte
0

Se você quiser escapar da entrada do usuário em uma variável, você pode fazer o seguinte no SQL

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

O @userinput agora será escapado com uma aspa simples extra para cada ocorrência de aspas

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

DE: SQL Server Escape an Underscore

R.Alonso
fonte
-2

Para manter o código fácil de ler, você pode usar colchetes []para citar a string que contém 'ou vice-versa.

Ben
fonte
Isso está incorreto. Os colchetes funcionam em caracteres ilegais em nomes de campo, tabela ou esquema.
Jamie Marshall
Sim, você está certo, é para os nomes dos objetos, não para o conteúdo da string. Devo ler a pergunta errado.
Ben