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.


4
Você pode nos mostrar a consulta ??
marc_s

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'

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

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.


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


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.


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'


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



-2

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


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
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.