Carattere di fuga in SQL Server


93

Voglio usare la citazione con il carattere di escape. Come posso fare?

Ho ricevuto un errore in SQL Server

Virgolette non chiuse dopo la stringa di caratteri.

Sto scrivendo una query SQL in una varcharvariabile ma ho ricevuto quell'errore:

Virgolette non chiuse dopo la stringa di caratteri.

Voglio usare le virgolette come carattere di escape.


4
Ti invitiamo a mostrare noi la query ??
marc_s

Risposte:


72

Per scappare 'devi semplicemente metterne un altro prima:''

Come mostra la seconda risposta, è possibile evitare virgolette singole in questo modo:

select 'it''s escaped'

il risultato sarà

it's escaped

Se stai concatenando SQL in un VARCHAR da eseguire (ovvero SQL dinamico), ti consiglio di parametrizzare l'SQL. Questo ha il vantaggio di aiutare a proteggersi dall'iniezione SQL e in più significa che non devi preoccuparti di sfuggire alle virgolette come questa (cosa che fai raddoppiando le virgolette).

ad esempio invece di fare

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

prova questo:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'

29
Perché questa è la risposta accettata? Non risponde alla domanda.
Peter Moore

3
@PeterMoore O l'OP avrebbe utilizzato la prima parte della mia risposta (raddoppiando le virgolette, come per le altre risposte di seguito), o avrebbe utilizzato l'approccio preferito che ho consigliato per creare una query SQL in una variabile stringa - per usare parametrizzata SQL. In ogni caso, entrambe sono risposte alla domanda
AdaTheDev

Non risponde alla domanda. A volte l'utente necessita di una connessione ODBC, il che significa che puoi utilizzare solo SQL puro.
Tony

Risposta modificata per renderla più chiara e più adatta alla domanda
Revious

121

Puoi sfuggire a una citazione in questo modo:

select 'it''s escaped'

il risultato sarà

it's escaped

Questa dovrebbe essere la risposta.
Tony

43

Puoi definire il tuo carattere di fuga, ma puoi usarlo solo con una LIKEclausola.

Esempio:

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

Qui cercherà %in tutta la stringa ed è così che si può usare l' ESCAPEidentificatore in SQL Server.


21

Devi solo sostituire 'con ''dentro la tua stringa

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

È inoltre possibile utilizzare REPLACE(@name, '''', '''''')se si genera l'SQL dinamicamente

Se si desidera eseguire l'escape all'interno di un'istruzione like, è necessario utilizzare la sintassi ESCAPE

Vale anche la pena ricordare che ti stai lasciando aperto agli attacchi di SQL injection se non lo prendi in considerazione. Maggiori informazioni su Google o: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F


e tuttavia le risposte di dugokontov o RichardPianka non hanno -1 simile?
Seph

@MichaelMunsey provalo tu stesso: select 'restituisce l'errore Unclosed quotation mark after the character string ''. Da nessuna parte nella mia risposta ne uso "solo due ', non sono sicuro del motivo per cui la mia è l'unica risposta con voti negativi.
settembre

12

L'escape delle virgolette in MSSQL viene eseguita da virgolette doppie, quindi a ''o a ""produrranno rispettivamente una con escape 'e ".


0

Puoi usare il **\**carattere prima del valore che vuoi sfuggire, ad es insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'


0

Se vuoi sfuggire all'input dell'utente in una variabile puoi fare come di seguito all'interno di SQL

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

Il @userinput verrà ora evitato con una citazione singola extra per ogni occorrenza di un preventivo



-2

Per mantenere il codice di facile lettura, è possibile utilizzare le parentesi quadre []per citare la stringa che lo contiene 'o viceversa.


Questo non è corretto. Le parentesi lavorano su caratteri non validi nei nomi di campi, tabelle o schemi.
Jamie Marshall

Sì, hai ragione, è per i nomi degli oggetti, non per i contenuti delle stringhe. Devo leggere la domanda sbagliata.
Ben
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.