Escape Character ใน SQL Server


95

ฉันต้องการใช้ใบเสนอราคากับอักขระหลีก ฉันจะทำอย่างไร?

ฉันได้รับข้อผิดพลาดใน SQL Server

เครื่องหมายคำพูดที่ไม่ปิดอยู่หลังสตริงอักขระ

ฉันกำลังเขียนแบบสอบถาม SQL ในvarcharตัวแปร แต่ฉันได้รับข้อผิดพลาดนั้น:

เครื่องหมายคำพูดที่ไม่ปิดอยู่หลังสตริงอักขระ

ฉันต้องการใช้เครื่องหมายคำพูดเป็นอักขระหลีก


4
คุณช่วยแสดงคำถามให้เราดูได้ไหม ??
marc_s

คำตอบ:


79

ในการหลบหนี'คุณจำเป็นต้องใส่อีกครั้งก่อน:''

เนื่องจากคำตอบที่สองแสดงให้เห็นว่าเป็นไปได้ที่จะหลีกเลี่ยงเครื่องหมายคำพูดเดียวเช่นนี้:

select 'it''s escaped'

ผลลัพธ์จะเป็น

it's escaped

หากคุณเชื่อมต่อ SQL เข้ากับ VARCHAR เพื่อดำเนินการ (เช่นไดนามิก SQL) ฉันขอแนะนำให้กำหนดพารามิเตอร์ SQL สิ่งนี้มีประโยชน์ในการช่วยป้องกันการแทรก SQL บวกหมายความว่าคุณไม่ต้องกังวลเกี่ยวกับการหลีกเลี่ยงเครื่องหมายคำพูดเช่นนี้

เช่นแทนที่จะทำ

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

ลองสิ่งนี้:

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

30
เหตุใดจึงเป็นคำตอบที่ได้รับการยอมรับ มันไม่ตอบคำถาม
Peter Moore

3
@PeterMoore ไม่ว่า OP จะใช้ส่วนที่ 1 ของคำตอบของฉัน (เพิ่มอัญประกาศเป็นสองเท่าตามคำตอบอื่น ๆ ด้านล่าง) หรือจะใช้แนวทางที่ฉันแนะนำสำหรับการสร้างแบบสอบถาม SQL ในตัวแปรสตริง - เพื่อใช้พารามิเตอร์ SQL ไม่ว่าจะด้วยวิธีใดทั้งสองคำตอบสำหรับคำถาม
AdaTheDev

มันไม่ตอบคำถาม บางครั้งผู้ใช้ต้องการการเชื่อมต่อ ODBC ซึ่งหมายความว่าคุณสามารถใช้ SQL บริสุทธิ์เท่านั้น
Tony

แก้ไขคำตอบให้ชัดเจนยิ่งขึ้นและเข้ากับคำถามได้ดีขึ้น
ย้อนกลับ

123

คุณสามารถหลีกเลี่ยงใบเสนอราคาเช่นนี้:

select 'it''s escaped'

ผลลัพธ์จะเป็น

it's escaped

นี่น่าจะเป็นคำตอบ
Tony

46

คุณกำหนดอักขระหลีกได้ แต่ใช้ได้เฉพาะกับLIKEอนุประโยคเท่านั้น

ตัวอย่าง:

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

ที่นี่จะค้นหา%ในสตริงทั้งหมดและนี่คือวิธีที่เราสามารถใช้ESCAPEตัวระบุในSQL Server.


21

คุณต้องแทนที่'ด้วย''ภายในสตริงของคุณ

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

คุณยังสามารถใช้REPLACE(@name, '''', '''''')หากสร้าง SQL แบบไดนามิก

หากคุณต้องการหลบหนีภายในคำสั่ง like คุณต้องใช้ไวยากรณ์ ESCAPE

นอกจากนี้ยังควรค่าแก่การกล่าวถึงว่าคุณปล่อยให้ตัวเองเปิดรับการโจมตีด้วยการฉีด SQL หากคุณไม่พิจารณา ข้อมูลเพิ่มเติมที่ Google หรือ: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F


และคำตอบโดย dugokontov หรือ RichardPianka ไม่มี -1 ที่คล้ายกัน?
SEPH

@MichaelMunsey ลองด้วยตัวคุณเอง: ส่งกลับข้อผิดพลาดselect ' Unclosed quotation mark after the character string ''ไม่มีคำตอบใดในคำตอบของฉันฉันใช้"เพียงสองข้อ'ไม่แน่ใจว่าทำไมของฉันจึงเป็นคำตอบเดียวที่มีการโหวตลง
SEPH

12

การหลีกเลี่ยงเครื่องหมายคำพูดใน MSSQL ทำได้โดยอัญประกาศคู่ดังนั้น a ''หรือ a ""จะทำให้เกิดค่า Escape 'และ"ตามลำดับ



0

หากคุณต้องการหลีกเลี่ยงการป้อนข้อมูลของผู้ใช้ในตัวแปรคุณสามารถทำได้เช่นด้านล่างภายใน SQL

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

ตอนนี้ @userinput จะถูกปิดด้วยเครื่องหมายคำพูดพิเศษสำหรับทุกครั้งที่มีการเสนอราคา



-2

เพื่อให้โค้ดอ่านง่ายคุณสามารถใช้วงเล็บเหลี่ยม[]เพื่ออ้างอิงสตริงที่มี'หรือในทางกลับกัน


สิ่งนี้ไม่ถูกต้อง วงเล็บใช้กับอักขระที่ผิดกฎหมายในชื่อฟิลด์ตารางหรือสคีมา
Jamie Marshall

ใช่คุณพูดถูกสำหรับชื่อวัตถุไม่ใช่เนื้อหาสตริง ฉันต้องอ่านคำถามผิด
เบ็น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.