SQL Server'da tek bir alıntıdan nasıl kaçarım?


956

9'da insertbir tabloya bazı metin verileri için çalışıyorum SQL Server.

Metin tek bir tırnak işareti (') içerir.

Bundan nasıl kaçabilirim?

İki tek tırnak kullanmayı denedim, ama bana bazı hatalar attı.

Örneğin. insert into my_table values('hi, my name''s tim.');


30
"bana bazı hatalar attı" - Bu hatalar nelerdi?
llamaoo7

Evet, çünkü MSSQL'de tek tırnak işaretleri koymanın doğru yolu, bunları ikiye katlamaktır. Bize gösterdiğin örnek çalışıyor olmalı. Bu SQL sorgusunu hangi dilde yapabilirsiniz? Yoksa SQL Server Management Studio'da mı?
MaxiWheat

Yanıtlar:


1388

Tek tırnak işaretleri , aynen örneğinizde bize gösterdiğiniz gibi, ikiye katlanarak kaçar . Aşağıdaki SQL bu işlevi göstermektedir. SQL Server 2008'de test ettim:

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

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

SELECT * FROM @my_table

Sonuçlar

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

16
sorunumu düzeltmek için yanlış yere bakıyordum. sonuçta bir karakter kaçışı sorunu değildi. benim sorunum veri uzunluğu sınırı aşılmış olmasıydı. tek alıntıyı iki kez kullanmanın karakterden kaçmanın doğru yolu olduğunu bana temin ettiğiniz için teşekkürler.
tim_wonil

Yani, 10 bin kelime içeren bir metnim varsa, tüm metnimi değiştirmem gerekir mi?
Vinicius Lima

3
@ViniciusLima: Kısa cevap evet. Bu, elbette, verileri depolamak için kullanacağınız teknolojiye bağlı olarak değişecektir. Bir ORM kullanıyorsanız bunu sizin için yapar. SQL komutlarınızı manuel olarak oluşturuyorsanız, dilin "hazırlanmış ifadeler" işlevini kullanmak istersiniz. Management Studio'da yapıyorsanız, bunun yerine değiştirmeniz gerekir.
Cᴏʀʏ

1
yani biri için iki tek tırnak. [''] => [']
Ujjwal Singh

67

Tek bir alıntıdan başka bir tek alıntıyla kaçmak sizin için çalışmıyorsa (son REPLACE()sorgularımdan biri için olmadığı gibi ), SET QUOTED_IDENTIFIER OFFsorgunuzdan önce, sonra sorgunuzdan sonra kullanabilirsiniz SET QUOTED_IDENTIFIER ON.

Örneğin

SET QUOTED_IDENTIFIER OFF;

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

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
Normalde iki katına çıkma yaklaşımını kullanıyorum, ancak daha sonra birden çok sunucu ve veritabanında çalıştırılan dinamik SQL ürettiğimde, bu çözüm benim için çalıştı, ancak iki katlama belirli bir durumda değildi. Bunun için teşekkürler!
Richard Moss

Hesaplanan sütunlardaki görünümlere ve dizinlere başvururken dikkatli olun, aksi takdirde hata alabilirsiniz. stackoverflow.com/questions/9235527/…
datagod

@RichardMoss, +1. sizinle aynı senaryoyu. Çifte yaklaşım ilk çözümdür. Birden çok sunucuda dinamik SQL gibi karmaşık sorgular için, bu işe yarayacak, iki katına
çıkma

48

Nasıl olur:

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

18
Bunun yerine char (39) kullan
Iswanto San

17

Teklifin ikiye katlanması işe yaradı, bu yüzden sizin için işe yaramadı; ancak, alternatif olarak dizenin etrafında tekli karakter yerine çift tırnak işareti kullanılır. yani,

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


4
Metin hem tek hem de çift tırnak içeriyorsa ne olur? Ayrıca, çift tırnak yalnızca alan adları için ayrılmamış mı?
Lajos Meszaros

11

Bu sorunu çözmenin 2 yolu:


çünkü 'dizede iki katına çıkarabilirsiniz, örneğin select 'I''m happpy':I'm happy


Herhangi bir karakter için emin değilsiniz: sql sunucusunda tarafından herhangi bir char unicode alabilirsiniz select unicode(':')(numarayı tutmak)

Bu durumda select 'I'+nchar(39)+'m happpy'


6

Ayrıca dikkat edilmesi gereken bir başka şey, gerçekten klasik bir ASCII '(ASCII 27) veya Unicode 2019 (aynı görünüyor, ancak aynı değil) olarak depolanıp depolanmayacağı.

Bu kesici uçlar için önemli bir şey değil, ancak dünya seçimler ve güncellemeler anlamına gelebilir.
Unicode değeri ise, bir WHERE yan tümcesinde (örn. Blah = 'Workers''s Comp') kaçmak, aradığınız değer orada değilse "Worker's Comp" içindeki gerçekte unicode değeri.

İstemci uygulamanız serbest anahtarın yanı sıra kopyala ve yapıştır tabanlı girişi destekliyorsa, bazı satırlarda Unicode, diğerlerinde ASCII olabilir!

Bunu doğrulamanın basit bir yolu, aradığınız değeri geri getirecek bir tür açık uçlu sorgu yapmak ve daha sonra bunu kopyalayıp notepad ++ veya başka bir unicode destek düzenleyicisine yapıştırmaktır.

Ascii değeri ve unicode olanı arasındaki farklı görünüm gözler için açık olmalıdır, ancak analize doğru eğilirseniz, bir hex editöründe 27 (ascii) veya 92 (unicode) olarak görünecektir.


4

Birçoğumuz, Tek Tırnaklardan Kaçmanın Popüler Yönteminin, bunları aşağıdaki gibi kolayca iki katına çıkarmak olduğunu biliyoruz.

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

Tek Tırnak Yöntemini İkiye Katlama

tek tırnaklardan kaçmanın başka alternatif yollarına bakacağız.

1.UNICODE Karakterleri

39, Tek Alıntı'nın UNICODE karakteridir. Bu yüzden aşağıdaki gibi kullanabiliriz.

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

UNICODE Karakterleri

2.QUOTED_IDENTIFIER

Başka bir basit ve en iyi alternatif çözüm QUOTED_IDENTIFIER kullanmaktır. QUOTED_IDENTIFIER, KAPALI olarak ayarlandığında, dizeler çift tırnak içine alınabilir. Bu senaryoda, tek tırnaktan kaçmak zorunda değiliz. Bu nedenle, tek tırnak işaretleri ile çok sayıda dize değeri kullanılırken bu yol çok yardımcı olacaktır. Sütun değerlerinin tek tırnak içerdiği çok sayıda INSERT / UPDATE komut dosyası satırı kullanılırken çok yardımcı olacaktır.

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

QUOTE_IDENTIFIER

SONUÇ

Yukarıda belirtilen yöntemler hem AZURE hem de Şirket İçi için geçerlidir.


1

Aşağıdaki sözdizimi SADECE BİR tırnak işaretinden kaçacaktır:

SELECT ''''

Sonuç tek bir teklif olacaktır. Dinamik SQL oluşturmak için çok yardımcı olabilir :). resim açıklamasını buraya girin


0

Bu çalışmalı

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

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

0

Eklenecek herhangi bir şeyden önce bir 'yerleştirin. Bu sqlServer'da bir kaçış karakteri gibi olacak

Örnek: Şu şekilde bir alanınız olduğunda, iyiyim . şunları yapabilirsiniz: UPDATE my_table SET row = 'İyiyim.';


OP'nin yaptığı tam olarak bu değildi ve en çok oy alan cevapla aynı şey söylendi mi? Muhtemelen hatanın başka bir kaynağı olmalı.
Michael MacAskill

-2

Bu işe yarar: ters eğik çizgi kullanın ve çift tırnak işareti koyun

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

Ne demek istiyorsun? Bunun PRINT \"hi, my name's tim.\";SSMS'de çalışacağını mı söylüyorsunuz ? Hiç işe yaramıyor ve hiç kimse bunun işe yaradığını söylemedi.
Mohammad Musavi

Asla çalışmaz.
Santosh Jadi
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.