Come posso evitare una singola citazione in SQL Server?


957

Sto cercando di insertinserire alcuni dati di testo in una tabella in SQL Server9.

Il testo include una virgoletta singola (').

Come posso evitarlo?

Ho provato a usare due virgolette singole, ma mi ha dato alcuni errori.

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


30
"mi ha gettato alcuni errori" - Quali erano questi errori?
llamaoo7,

Sì perché il modo giusto per inserire virgolette singole in MSSQL è raddoppiarle. L'esempio che ci mostri dovrebbe funzionare. Come si effettua questa query SQL, con quale lingua? O è in SQL Server Management Studio?
MaxiWheat,

Risposte:


1389

Le virgolette singole vengono eliminate raddoppiandole , proprio come ci hai mostrato nel tuo esempio. Il seguente SQL illustra questa funzionalità. L'ho provato su SQL Server 2008:

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

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

SELECT * FROM @my_table

risultati

value
==================
hi, my name's tim.

16
stavo guardando nel posto sbagliato per risolvere il mio problema. dopotutto non era un problema di fuga di personaggi. il mio problema era che la lunghezza dei dati era oltre il limite. grazie per avermi rassicurato sul fatto che usare la singola citazione due volte è il modo giusto di sfuggire al personaggio.
tim_wonil,

Quindi, se ho un testo contenente 10k parole, sarà necessario sostituire tutto il mio testo?
Vinicius Lima,

3
@ViniciusLima: la risposta breve è sì. Ciò cambierebbe ovviamente a seconda della tecnologia che utilizzerai per archiviare i dati. Se stai usando un ORM, lo farà per te. Se stai compilando manualmente i tuoi comandi SQL, ti consigliamo di utilizzare la funzionalità "istruzioni preparate" della lingua. Se lo stai facendo in Management Studio, dovrai fare la sostituzione.
Cᴏʀʏ

1
cioè due virgolette singole per una. [''] => [']
Ujjwal Singh,

67

Se l'escape della tua singola citazione con un'altra singola citazione non funziona per te (come non ha fatto per una delle mie REPLACE()query recenti ), puoi utilizzare SET QUOTED_IDENTIFIER OFFprima della query, quindi SET QUOTED_IDENTIFIER ONdopo la query.

Per esempio

SET QUOTED_IDENTIFIER OFF;

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

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
Normalmente uso l'approccio raddoppiato, ma dove stavo generando SQL dinamico che veniva poi eseguito su più server e database, questa soluzione ha funzionato per me mentre il raddoppio non ha funzionato in un caso specifico. Grazie per questo!
Richard Moss,

Fai attenzione quando fai riferimento a viste e indici su colonne calcolate o potresti ricevere un errore. stackoverflow.com/questions/9235527/...
datagod

@RichardMoss, +1. stesso scenario con te. l'approccio raddoppiato è la soluzione iniziale. Per query complesse come SQL dinamico su più server, questo funzionerà, l'approccio raddoppiato potrebbe non funzionare
Edgar Allan Bayron,

48

Che ne dite di:

insert into my_table values('hi, my name'+char(39)+'s tim.')

18
usa invece char (39)
Iswanto San

17

Il raddoppio della citazione avrebbe dovuto funzionare, quindi è strano che non abbia funzionato per te; tuttavia, un'alternativa sta usando i caratteri di virgoletta doppia, anziché singoli, attorno alla stringa. Vale a dire,

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


4
Cosa succede se il testo contiene virgolette singole e doppie? Inoltre, le doppie virgolette non sono riservate solo ai nomi dei campi?
Lajos Meszaros,

11

2 modi per aggirare questo:


perché 'puoi semplicemente raddoppiarlo nella stringa, ad es. select 'I''m happpy'- otterrai:I'm happy


Per qualsiasi personaggio di cui non sei sicuro: nel server sql puoi ottenere un Unicode di qualsiasi carattere select unicode(':')(mantieni il numero)

Quindi anche questo caso select 'I'+nchar(39)+'m happpy'


6

Un'altra cosa da tenere in considerazione è se è davvero memorizzato come un ASCII classico (ASCII 27) o Unicode 2019 (che sembra simile, ma non uguale).

Questo non è un grosso problema per gli inserti, ma può significare il mondo per le selezioni e gli aggiornamenti.
Se è il valore unicode, sfuggire alla 'in una clausola WHERE (es. Dove blah =' Comp dei lavoratori ') restituirà come il valore che stai cercando non è lì se il' in "Comp del lavoratore" è in realtà il valore unicode.

Se l'applicazione client supporta l'input basato su chiave libera, nonché copia e incolla, potrebbe essere Unicode in alcune righe e ASCII in altre!

Un modo semplice per confermare ciò consiste nel fare una sorta di query a risposta aperta che riporterà il valore che stai cercando, quindi copiarlo e incollarlo in Notepad ++ o in qualche altro editor di supporto Unicode.

L'aspetto diverso tra il valore ASCII e quello Unicode dovrebbe essere ovvio per gli occhi, ma se ti inclini verso l'anale, apparirà come 27 (ASCII) o 92 (Unicode) in un editor esadecimale.


4

Molti di noi sanno che il metodo popolare per sfuggire alle citazioni singole è raddoppiarle facilmente come di seguito.

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

Raddoppio del metodo delle virgolette singole

esamineremo alcuni altri modi alternativi per sfuggire alle virgolette singole.

1. Personaggi UNICODE

39 è il carattere UNICODE di Single Quote. Quindi possiamo usarlo come di seguito.

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

Personaggi UNICODE

2.QUOTED_IDENTIFIER

Un'altra soluzione alternativa semplice e migliore è utilizzare QUOTED_IDENTIFIER. Quando QUOTED_IDENTIFIER è impostato su OFF, le stringhe possono essere racchiuse tra virgolette doppie. In questo scenario, non è necessario sfuggire alle virgolette singole. Quindi, in questo modo sarebbe molto utile usando molti valori stringa con virgolette singole. Sarà molto utile durante l'utilizzo di così tante righe di script INSERT / UPDATE in cui i valori di colonna hanno virgolette singole.

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

QUOTE_IDENTIFIER

CONCLUSIONE

I metodi sopra menzionati sono applicabili sia a AZURE che a locali.


1

La seguente sintassi ti sfuggirà SOLO UNA virgoletta:

SELECT ''''

Il risultato sarà una singola citazione. Potrebbe essere molto utile per la creazione di SQL dinamico :). inserisci qui la descrizione dell'immagine


0

Questo dovrebbe funzionare

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

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

0

Basta inserire un 'prima di tutto per essere inserito. Sarà come un carattere di escape in sqlServer

Esempio: quando hai un campo come, sto bene . puoi fare: UPDATE my_table SET row = 'Sto bene.';


Non è esattamente quello che ha fatto il PO e lo stesso della risposta più votata dice già? Presumibilmente ci deve essere stata qualche altra fonte dell'errore.
Michael MacAskill,

-3

Dovrebbe funzionare: usa una barra rovesciata e metti una doppia citazione

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

Cosa intendi? Stai dicendo che PRINT \"hi, my name's tim.\";funzionerà in SSMS? Non funziona affatto e nessuno ha mai detto che funziona.
Mohammad Musavi,

Non funzionerà mai.
Santosh Jadi,
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.