Karakter Escape di SQL Server

95

Saya ingin menggunakan kutipan dengan karakter pelarian. Bagaimana saya bisa melakukannya?

Saya telah menerima kesalahan di SQL Server

Tanda kutip tidak ditutup setelah string karakter.

Saya menulis kueri SQL dalam varcharvariabel tetapi saya telah menerima kesalahan itu:

Tanda kutip tidak ditutup setelah string karakter.

Saya ingin menggunakan tanda kutip sebagai karakter melarikan diri.

esquare
sumber
4
Bisakah Anda menunjukkan pertanyaannya kepada kami ??
marc_s
2
Kemungkinan duplikat Bagaimana cara lolos dari satu kutipan di SQL Server?
Jens Schauder

Jawaban:

79

Untuk melarikan diri 'Anda hanya perlu meletakkan yang lain sebelumnya:''

Seperti yang ditunjukkan oleh jawaban kedua, mungkin untuk menghindari kutipan tunggal seperti ini:

select 'it''s escaped'

hasilnya akan

it's escaped

Jika Anda menggabungkan SQL menjadi VARCHAR untuk dieksekusi (yaitu SQL dinamis), maka saya akan merekomendasikan parameterisasi SQL. Ini memiliki manfaat membantu menjaga terhadap injeksi SQL plus berarti Anda tidak perlu khawatir tentang keluar dari kutipan seperti ini (yang Anda lakukan dengan menggandakan tanda kutip).

misalnya daripada melakukan

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

coba ini:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'
AdaTheDev
sumber
30
Mengapa ini jawaban yang diterima? Itu tidak menjawab pertanyaan itu.
Peter Moore
3
@PeterMoore Entah OP akan menggunakan bagian pertama dari jawaban saya (menggandakan tanda kutip, sesuai jawaban lain di bawah), atau akan menggunakan pendekatan pilihan yang saya rekomendasikan untuk membangun kueri SQL dalam variabel string - untuk menggunakan parameterized SQL. Apa pun itu, keduanya adalah jawaban atas pertanyaan
AdaTheDev
Itu tidak menjawab pertanyaan itu. Terkadang pengguna membutuhkan koneksi ODBC yang berarti Anda hanya dapat menggunakan SQL murni.
Tony
Jawaban yang diedit untuk lebih jelas dan lebih sesuai dengan pertanyaan
Revious
123

Anda dapat menghindari kutipan seperti ini:

select 'it''s escaped'

hasilnya akan

it's escaped
dugokontov
sumber
Ini harus menjadi jawabannya.
Tony
46

Anda dapat menentukan karakter pelarian Anda, tetapi Anda hanya dapat menggunakannya dengan LIKEklausa.

Contoh:

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

Di sini ia akan mencari %seluruh string dan ini adalah bagaimana seseorang dapat menggunakan ESCAPEpengenal di SQL Server.

Aniket A
sumber
21

Anda hanya perlu mengganti 'dengan ''inside string Anda

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

Anda juga dapat menggunakan REPLACE(@name, '''', '''''')jika membuat SQL secara dinamis

Jika Anda ingin keluar di dalam pernyataan like maka Anda perlu menggunakan sintaks ESCAPE

Perlu juga disebutkan bahwa Anda membiarkan diri Anda terbuka terhadap serangan injeksi SQL jika Anda tidak mempertimbangkannya. Info lebih lanjut di Google atau: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F

Seph
sumber
namun jawaban oleh dugokontov atau RichardPianka tidak memiliki kesamaan -1?
Seph
@MichaelMunsey mencobanya sendiri: select 'kembalikan kesalahan Unclosed quotation mark after the character string ''. Tidak ada dalam jawaban saya yang saya gunakan "hanya dua ', tidak yakin mengapa jawaban saya adalah satu-satunya jawaban dengan suara rendah.
Seph
12

Kutipan melarikan diri di MSSQL dilakukan dengan tanda kutip ganda, sehingga a ''atau a ""akan menghasilkan satu lolos 'dan ", masing-masing.

Richard Pianka
sumber
0

Anda dapat menggunakan **\**karakter sebelum nilai yang ingin Anda hilangkan misalnya insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'

duniawi paradoks
sumber
0

Jika Anda ingin melepaskan input pengguna dalam variabel, Anda dapat melakukan seperti di bawah ini dalam SQL

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

@Userinput sekarang akan di-escape dengan satu kutipan ekstra untuk setiap kemunculan kutipan

Nayajiv
sumber
0
WHERE username LIKE '%[_]d';            -- @Lasse solution
WHERE username LIKE '%$_d' ESCAPE '$';
WHERE username LIKE '%^_d' ESCAPE '^';

DARI: SQL Server Escape an Underscore

R. Alonso
sumber
-2

Agar kode mudah dibaca, Anda dapat menggunakan tanda kurung siku []untuk mengutip string yang berisi 'atau sebaliknya.

Ben
sumber
Ini salah Tanda kurung bekerja pada karakter ilegal di bidang, tabel, atau nama skema.
Jamie Marshall
Ya, Anda benar, ini untuk nama objek, bukan konten string. Saya harus salah membaca pertanyaan.
Ben