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.


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'

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

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.


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


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


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'


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



-2

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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.