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 varchar
zmiennej, ale otrzymałem ten błąd:
Niezamknięty cudzysłów po ciągu znaków.
Chcę użyć cudzysłowu jako znaku zmiany znaczenia.
sql-server
escaping
char
esquare
źródło
źródło
Odpowiedzi:
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
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'
źródło
Możesz uniknąć cytatu w ten sposób:
select 'it''s escaped'
wynik będzie
źródło
Możesz zdefiniować swój znak ucieczki, ale możesz go używać tylko z
LIKE
klauzulą.Przykład:
SELECT columns FROM table WHERE column LIKE '%\%%' ESCAPE '\'
Tutaj będzie szukać
%
całego ciągu i tak można użyćESCAPE
identyfikatora wSQL Server
.źródło
Trzeba po prostu wymienić
'
się''
wewnątrz łańcuchaSELECT colA, colB, colC FROM tableD WHERE colA = 'John''s Mobile'
Możesz także użyć
REPLACE(@name, '''', '''''')
przypadku dynamicznego generowania kodu SQLJeś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
źródło
select '
zwraca błądUnclosed 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.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"
.źródło
Możesz użyć
**\**
znaku przed wartością, którą chcesz uciec, npinsert into msglog(recipient) values('Mr. O\'riely')
select * from msglog where recipient = 'Mr. O\'riely'
źródło
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
źródło
WHERE username LIKE '%[_]d'; -- @Lasse solution WHERE username LIKE '%$_d' ESCAPE '$'; WHERE username LIKE '%^_d' ESCAPE '^';
OD: SQL Server Escape an underscore
źródło
Aby kod był łatwy do odczytania, możesz użyć nawiasów kwadratowych w
[]
celu zacytowania ciągu zawierającego'
lub odwrotnie.źródło