SQL Server'da Çıkış Karakteri


95

Kaçış karakteriyle tırnak kullanmak istiyorum. Nasıl yapabilirim?

SQL Server'da hata aldım

Karakter dizisinden sonra kapatılmamış tırnak işareti.

Bir varchardeğişkene SQL sorgusu yazıyorum ama şu hatayı aldım:

Karakter dizisinden sonra kapatılmamış tırnak işareti.

Tırnak işaretini bir çıkış karakteri olarak kullanmak istiyorum.


4
Lütfen bize sorguyu gösterir misin ?
marc_s

Yanıtlar:


79

Kaçmak 'için önce bir tane daha koymanız gerekir:''

İkinci cevabın gösterdiği gibi, tek bir alıntıdan şu şekilde kaçmak mümkündür:

select 'it''s escaped'

sonuç olacak

it's escaped

SQL'i yürütmek için bir VARCHAR'a birleştiriyorsanız (yani dinamik SQL), SQL'i parametrelendirmenizi tavsiye ederim. Bu, SQL enjeksiyonuna karşı korunmaya yardımcı olma avantajına sahiptir, ayrıca bunun gibi alıntılardan kaçma konusunda endişelenmenize gerek olmadığı anlamına gelir (bu, tırnak işaretlerini ikiye katlayarak yaparsınız).

örneğin yapmak yerine

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

bunu dene:

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

30
Neden kabul edilen cevap bu? Soruyu cevaplamıyor.
Peter Moore

3
@PeterMoore Ya OP, cevabımın 1. bölümünü kullanır (aşağıdaki diğer cevaplara göre alıntıları ikiye katlar) veya bir dize değişkeninde bir SQL sorgusu oluşturmak için önerdiğim tercih edilen yaklaşımı kullanırdı - parametreleştirilmiş kullanmak için SQL. Her iki durumda da sorunun cevabı her ikisi de
AdaTheDev

Soruyu cevaplamıyor. Bazen kullanıcılar ODBC bağlantısına ihtiyaç duyar, bu da yalnızca saf SQL kullanabileceğiniz anlamına gelir.
Tony

Cevap daha net ve soruya daha iyi uyacak şekilde düzenlendi
Revious

123

Alıntıdan şu şekilde kaçabilirsiniz:

select 'it''s escaped'

sonuç olacak

it's escaped

Cevap bu olmalı.
Tony

46

Kaçış karakterinizi tanımlayabilirsiniz, ancak onu yalnızca bir LIKEcümle ile kullanabilirsiniz .

Misal:

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

Burada %tüm dizede arayacaktır ve bu, ESCAPEiçinde tanımlayıcıyı nasıl kullanabileceğidir SQL Server.


21

Sadece değiştirmeniz gerekiyor 'ile ''sizin dize içinde

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

REPLACE(@name, '''', '''''')SQL'i dinamik olarak oluşturuyorsanız da kullanabilirsiniz.

Benzer bir ifadenin içinden kaçmak istiyorsanız, ESCAPE sözdizimini kullanmanız gerekir.

Ayrıca, dikkate almıyorsanız, kendinizi SQL enjeksiyon saldırılarına açık bıraktığınızı belirtmekte fayda var. Google'da daha fazla bilgi veya: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F


ve yine de dugokontov veya RichardPianka'nın yanıtlarında benzer -1 yok mu?
Seph

@MichaelMunsey kendiniz deneyin: select 'hatayı döndürür Unclosed quotation mark after the character string ''. Cevabımın hiçbir yerinde "sadece iki tane kullanmıyorum ', neden benimkinin olumsuz oylarla tek cevap olduğuna emin değilim.
Seph

12

MSSQL'de kaçan alıntılar bir çift tırnak ile yapılır, bu nedenle a ''veya a , sırasıyla bir çıkış karakterli ve ""üretir .'"


0

**\**Kaçmak istediğiniz değerden önceki karakteri kullanabilirsiniz, örneğin insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'


0

Bir değişkende kullanıcı girişinden çıkmak istiyorsanız, aşağıdaki gibi SQL içinde yapabilirsiniz

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

@Userinput artık bir alıntı her geçtiği için fazladan tek bir alıntı ile önlenecek



-2

Kodun kolay okunmasını sağlamak için, []içeren dizeyi tırnak içine almak için köşeli parantezleri kullanabilir 'veya tam tersini yapabilirsiniz.


Bu yanlış. Köşeli parantezler alan, tablo veya şema adlarındaki geçersiz karakterler üzerinde çalışır.
Jamie Marshall

Evet, haklısın, bu nesne isimleri için, dizi içerikleri için değil. Soruyu yanlış okumalıyım.
Ben
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.