Bagaimana cara saya lolos dari penawaran tunggal di SQL Server?


957

Saya mencoba insertbeberapa data teks ke dalam tabel di SQL Server9.

Teks ini menyertakan kutipan tunggal (').

Bagaimana saya bisa lolos dari itu?

Saya mencoba menggunakan dua tanda kutip tunggal, tetapi itu memberi saya beberapa kesalahan.

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


30
"itu memberiku beberapa kesalahan" - Apa kesalahan ini?
llamaoo7

Ya karena cara yang tepat untuk memasukkan tanda kutip tunggal dalam MSSQL adalah dengan menggandakannya. Contoh yang Anda perlihatkan kepada kami harus berfungsi. Bagaimana Anda membuat kueri SQL ini, dengan bahasa apa? Atau apakah itu di SQL Server Management Studio?
MaxiWheat

Jawaban:


1389

Kutipan tunggal lolos dengan menggandakannya , sama seperti Anda telah menunjukkan kepada kami dalam contoh Anda. SQL berikut menggambarkan fungsi ini. Saya mengujinya di SQL Server 2008:

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

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

SELECT * FROM @my_table

Hasil

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

16
Saya melihat tempat yang salah untuk memperbaiki masalah saya. itu bukan masalah pelarian karakter. masalah saya adalah bahwa panjang data melebihi batas. terima kasih telah meyakinkan saya bahwa menggunakan kutipan tunggal dua kali adalah cara yang tepat untuk keluar dari karakter.
tim_wonil

Jadi, jika saya memiliki teks yang berisi 10rb kata-kata, saya perlu mengganti semua teks saya?
Vinicius Lima

3
@ViniciusLima: Jawaban singkatnya adalah ya. Itu akan berubah tentu saja tergantung pada teknologi yang akan Anda gunakan untuk menyimpan data. Jika Anda menggunakan ORM, itu akan melakukannya untuk Anda. Jika Anda membuat perintah SQL secara manual, Anda akan ingin menggunakan fungsionalitas "pernyataan yang disiapkan" bahasa. Jika Anda melakukannya di Management Studio maka Anda harus melakukan penggantian.
C

1
yaitu dua kutipan tunggal untuk satu. [''] => [']
Ujjwal Singh

67

Jika lolos dari penawaran tunggal Anda dengan penawaran tunggal lainnya tidak berfungsi untuk Anda (seperti tidak untuk salah satu REPLACE()permintaan saya baru-baru ini ), Anda dapat menggunakan SET QUOTED_IDENTIFIER OFFsebelum permintaan Anda, kemudian SET QUOTED_IDENTIFIER ONsetelah permintaan Anda.

Sebagai contoh

SET QUOTED_IDENTIFIER OFF;

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

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
Biasanya saya menggunakan pendekatan dua kali lipat, tetapi di mana saya menghasilkan SQL dinamis yang kemudian dijalankan di beberapa server dan database, solusi ini bekerja untuk saya sedangkan penggandaan tidak dalam satu kasus tertentu. Terima kasih untuk ini!
Richard Moss

Hati-hati saat mereferensikan tampilan dan indeks pada kolom yang dihitung atau Anda mungkin mendapatkan kesalahan. stackoverflow.com/questions/9235527/…
datagod

@RichardMoss, +1. Skenario yang sama dengan Anda. Pendekatan doubled up adalah solusi awal. Untuk pertanyaan kompleks seperti SQL dinamis di beberapa server, ini akan berhasil, pendekatan dua kali lipat mungkin tidak
Edgar Allan Bayron

48

Bagaimana tentang:

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

18
gunakan char (39) sebagai gantinya
Iswanto San

17

Penggandaan kutipan seharusnya berhasil, jadi aneh bahwa itu tidak bekerja untuk Anda; Namun, sebuah alternatif menggunakan karakter kutipan ganda, alih-alih yang tunggal, di sekitar string. Yaitu,

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


4
Bagaimana jika teks berisi tanda kutip tunggal dan ganda? Juga, bukankah tanda kutip ganda dicadangkan hanya untuk nama bidang?
Lajos Meszaros

11

2 cara untuk mengatasi ini:


untuk 'Anda cukup dengan menggandakannya dalam string, misalnya select 'I''m happpy'- akan mendapatkan:I'm happy


Untuk charactor apa pun Anda tidak yakin: di sql server Anda bisa mendapatkan unicode char apa pun dengan select unicode(':')(Anda menyimpan nomornya)

Jadi hal ini bisa juga Anda lakukan select 'I'+nchar(39)+'m happpy'


6

Juga hal lain yang harus diperhatikan adalah apakah benar-benar disimpan sebagai ASCII klasik '(ASCII 27) atau Unicode 2019 (yang terlihat mirip, tetapi tidak sama).

Ini bukan masalah besar pada sisipan, tetapi ini bisa berarti dunia dalam memilih dan memperbarui.
Jika itu adalah nilai unicode maka keluar dari 'dalam klausa WHERE (misalnya di mana bla =' Kompor Pekerja ') akan kembali seperti nilai yang Anda cari tidak ada jika' dalam "Kompor Pekerja" sebenarnya adalah nilai unicode.

Jika aplikasi klien Anda mendukung kunci bebas, serta input berbasis salin dan rekat, itu bisa berupa Unicode di beberapa baris, dan ASCII di baris lain!

Cara sederhana untuk mengonfirmasi ini adalah dengan melakukan semacam permintaan terbuka yang akan mengembalikan nilai yang Anda cari, lalu menyalin dan menempelkannya ke notepad ++ atau editor pendukung unicode lainnya.

Penampilan yang berbeda antara nilai ascii dan unicode harus jelas bagi mata, tetapi jika Anda condong ke arah anal, itu akan muncul sebagai 27 (ascii) atau 92 (unicode) dalam hex editor.


4

Banyak dari kita tahu bahwa Metode Populer untuk Melewati Kutipan Tunggal adalah dengan menggandakannya dengan mudah seperti di bawah ini.

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

Menggandakan Metode Kutipan Tunggal

kita akan melihat beberapa cara alternatif lain untuk lolos dari tanda kutip tunggal.

1.UNICODE Karakter

39 adalah karakter UNICODE dari Kutipan Tunggal. Jadi kita bisa menggunakannya seperti di bawah ini.

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

Karakter UNICODE

2.QUOTED_IDENTIFIER

Solusi alternatif sederhana dan terbaik lainnya adalah dengan menggunakan QUOTED_IDENTIFIER. Ketika QUOTED_IDENTIFIER diatur ke OFF, string dapat dilampirkan dalam tanda kutip ganda. Dalam skenario ini, kita tidak perlu keluar dari tanda kutip tunggal. Jadi, cara ini akan sangat membantu saat menggunakan banyak nilai string dengan tanda kutip tunggal. Ini akan sangat membantu saat menggunakan begitu banyak baris skrip INSERT / UPDATE di mana nilai kolom memiliki tanda kutip tunggal.

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

QUOTE_IDENTIFIER

KESIMPULAN

Metode yang disebutkan di atas berlaku untuk AZURE dan On Premises.


1

Sintaks berikut akan lolos Anda HANYA SATU tanda kutip:

SELECT ''''

Hasilnya akan menjadi kutipan tunggal. Mungkin sangat membantu untuk membuat SQL dinamis :). masukkan deskripsi gambar di sini


0

Ini seharusnya bekerja

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

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

0

Cukup masukkan 'sebelum memasukkan apa pun. Ini akan seperti karakter pelarian di sqlServer

Contoh: Ketika Anda memiliki bidang sebagai, saya baik-baik saja . Anda dapat melakukannya: MEMPERBARUI my_table SET row = 'Saya baik-baik saja.';


Bukankah itu persis seperti yang dilakukan OP, dan sama dengan yang sudah dijawab oleh pemilih yang terpilih? Agaknya pasti ada sumber kesalahan lainnya.
Michael MacAskill

-2

Ini harus bekerja: gunakan garis miring dan beri penawaran ganda

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

Apa maksudmu? Anda mengatakan bahwa PRINT \"hi, my name's tim.\";akan bekerja di SSMS? Itu tidak bekerja sama sekali dan tidak ada yang pernah mengatakan itu bekerja
Mohammad Musavi

Tidak akan pernah berhasil.
Santosh Jadi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.