Znak ucieczki w SQL Server

95

Chcę użyć cudzysłowu ze znakiem ucieczki. Jak mam to zrobić?

Otrzymałem błąd w SQL Server

Niezamknięty cudzysłów po ciągu znaków.

Piszę zapytanie SQL w varcharzmiennej, ale otrzymałem ten błąd:

Niezamknięty cudzysłów po ciągu znaków.

Chcę użyć cudzysłowu jako znaku zmiany znaczenia.

esquare
źródło
4
Czy możesz nam pokazać zapytanie?
marc_s

Odpowiedzi:

79

Aby uciec, 'musisz po prostu umieścić inny przed:''

Jak pokazuje druga odpowiedź, możliwe jest uniknięcie pojedynczego cudzysłowu w ten sposób:

select 'it''s escaped'

wynik będzie

it's escaped

Jeśli łączysz SQL z VARCHAR w celu wykonania (np. Dynamiczny SQL), to polecam parametryzację SQL. Ma to tę zaletę, że pomaga chronić przed wstrzyknięciem SQL, a ponadto oznacza, że ​​nie musisz się martwić o unikanie cudzysłowów w ten sposób (co robisz, podwajając cudzysłowy).

np. zamiast robić

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

Spróbuj tego:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'
AdaTheDev
źródło
30
Dlaczego jest to akceptowana odpowiedź? Nie odpowiada na pytanie.
Peter Moore,
3
@PeterMoore Albo OP użyłby pierwszej części mojej odpowiedzi (podwajając cudzysłowy, jak w innych odpowiedziach poniżej), albo użyłby preferowanego podejścia, które zaleciłem do tworzenia zapytania SQL w zmiennej łańcuchowej - aby użyć sparametryzowanego SQL. Tak czy inaczej, oba są odpowiedziami na pytanie
AdaTheDev,
Nie odpowiada na pytanie. Czasami użytkownik potrzebuje połączenia ODBC, co oznacza, że ​​można używać tylko czystego SQL.
Tony
Zredagowana odpowiedź, aby była bardziej przejrzysta i lepiej pasowała do pytania
Revious
123

Możesz uniknąć cytatu w ten sposób:

select 'it''s escaped'

wynik będzie

it's escaped
dugokontov
źródło
To powinna być odpowiedź.
Tony
46

Możesz zdefiniować swój znak ucieczki, ale możesz go używać tylko z LIKEklauzulą.

Przykład:

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

Tutaj będzie szukać %całego ciągu i tak można użyć ESCAPEidentyfikatora w SQL Server.

Aniket A
źródło
21

Trzeba po prostu wymienić 'się ''wewnątrz łańcucha

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

Możesz także użyć REPLACE(@name, '''', '''''') przypadku dynamicznego generowania kodu SQL

Jeśli chcesz uciec wewnątrz instrukcji like, musisz użyć składni ESCAPE

Warto również wspomnieć, że jeśli się nad tym nie zastanawiasz, narażasz się na ataki typu SQL injection. Więcej informacji w Google lub: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F

Seph
źródło
a jednak odpowiedzi dugokontowa czy RichardaPianki nie mają podobnych -1?
Seph
@MichaelMunsey spróbuj sam: select 'zwraca błąd Unclosed quotation mark after the character string ''. Nigdzie w mojej odpowiedzi nie używam "tylko dwóch ', nie jestem pewien, dlaczego moja jest jedyną odpowiedzią z głosami negatywnymi.
Seph
12

Unikanie cudzysłowów w MSSQL odbywa się za pomocą podwójnego cudzysłowu, więc a ''lub a ""utworzą odpowiednio jeden znak ze znakiem ucieczki 'i ".

Richard Pianka
źródło
0

Możesz użyć **\**znaku przed wartością, którą chcesz uciec, np insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'

Ziemianin paradoks
źródło
0

Jeśli chcesz uniknąć wprowadzania danych przez użytkownika w zmiennej, możesz zrobić jak poniżej w SQL

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

@Userinput będzie teraz poprzedzony dodatkowym pojedynczym cudzysłowem dla każdego wystąpienia cytatu

Nayajiv
źródło
0
WHERE username LIKE '%[_]d';            -- @Lasse solution
WHERE username LIKE '%$_d' ESCAPE '$';
WHERE username LIKE '%^_d' ESCAPE '^';

OD: SQL Server Escape an underscore

R. Alonso
źródło
-2

Aby kod był łatwy do odczytania, możesz użyć nawiasów kwadratowych w []celu zacytowania ciągu zawierającego 'lub odwrotnie.

Ben
źródło
To jest niepoprawne. Nawiasy działają na niedozwolonych znakach w nazwach pól, tabel lub schematów.
Jamie Marshall
Tak, masz rację, chodzi o nazwy obiektów, a nie zawartość ciągu. Muszę źle odczytać pytanie.
Ben,