ฉันกำลังพยายามหาinsert
ข้อมูลตัวอักษรลงในตารางที่SQL Server
9
ข้อความประกอบด้วยเครื่องหมายคำพูดเดี่ยว (')
ฉันจะหนีได้อย่างไร
ฉันพยายามใช้สองคำพูดเดียว แต่มันทำให้ฉันมีข้อผิดพลาด
เช่น. insert into my_table values('hi, my name''s tim.');
ฉันกำลังพยายามหาinsert
ข้อมูลตัวอักษรลงในตารางที่SQL Server
9
ข้อความประกอบด้วยเครื่องหมายคำพูดเดี่ยว (')
ฉันจะหนีได้อย่างไร
ฉันพยายามใช้สองคำพูดเดียว แต่มันทำให้ฉันมีข้อผิดพลาด
เช่น. insert into my_table values('hi, my name''s tim.');
คำตอบ:
การเสนอราคาเดี่ยวจะถูกหลีกเลี่ยงโดยเพิ่มขึ้นเป็นสองเท่าเช่นเดียวกับที่คุณแสดงให้เราเห็นในตัวอย่างของคุณ SQL ต่อไปนี้แสดงฟังก์ชันการทำงานนี้ ฉันทดสอบใน SQL Server 2008:
DECLARE @my_table TABLE (
[value] VARCHAR(200)
)
INSERT INTO @my_table VALUES ('hi, my name''s tim.')
SELECT * FROM @my_table
value
==================
hi, my name's tim.
หากการหลีกเลี่ยงการอ้างคำพูดเดี่ยวด้วยคำพูดเดียวไม่ได้ผลสำหรับคุณ (ไม่เหมือนกับการREPLACE()
สอบถามล่าสุดของฉัน) คุณสามารถใช้SET QUOTED_IDENTIFIER OFF
ก่อนการสืบค้นจากนั้นSET QUOTED_IDENTIFIER ON
หลังจากการสอบถาม
ตัวอย่างเช่น
SET QUOTED_IDENTIFIER OFF;
UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");
SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again
เกี่ยวกับ:
insert into my_table values('hi, my name'+char(39)+'s tim.')
การเสนอราคาเพิ่มขึ้นเป็นสองเท่าควรจะได้ผลดังนั้นจึงเป็นเรื่องแปลกประหลาดที่ไม่ได้ผลสำหรับคุณ อย่างไรก็ตามทางเลือกคือการใช้อักขระเครื่องหมายคำพูดคู่แทนที่จะใช้ตัวอักษรเดี่ยวล้อมรอบสตริง กล่าวคือ
insert into my_table values("hi, my name's tim."
);
2 วิธีในการหลีกเลี่ยงปัญหานี้:
สำหรับ'
คุณสามารถเพิ่มเป็นสองเท่าในสตริงเช่น
select 'I''m happpy'
- จะได้รับ:I'm happy
สำหรับตัวอักษรใด ๆ ที่คุณไม่แน่ใจ: ใน sql server คุณสามารถรับ unicode ของถ่านโดย select unicode(':')
(คุณเก็บหมายเลข)
ดังนั้นกรณีนี้คุณสามารถ select 'I'+nchar(39)+'m happpy'
สิ่งที่ต้องระวังอีกอย่างคือมันถูกเก็บไว้ในรูปแบบ ASCII '(ASCII 27) หรือ Unicode 2019 (ซึ่งมีลักษณะคล้ายกัน แต่ไม่เหมือนกัน) หรือไม่
นี่ไม่ใช่เรื่องใหญ่สำหรับเม็ดมีด แต่อาจหมายถึงโลกที่เลือกและอัพเดต
หากเป็นค่ายูนิโค้ดให้หลีกเลี่ยงการ 'ในส่วนคำสั่ง WHERE (เช่นเมื่อ blah =' คอมพ์ของคนงาน ') จะกลับมาเหมือนค่าที่คุณกำลังค้นหาไม่ได้อยู่ที่นั่นถ้า' ใน 'คอมพ์ของคนงาน' เป็นจริง ค่า Unicode
หากแอปพลิเคชันไคลเอนต์ของคุณรองรับคีย์ฟรีเช่นเดียวกับการคัดลอกและวางตามอินพุตอาจเป็น Unicode ในบางแถวและ ASCII ในที่อื่น ๆ !
วิธีง่ายๆในการยืนยันการทำเช่นนี้คือการทำคิวรีแบบปลายเปิดซึ่งจะนำค่าที่คุณค้นหากลับมาแล้วคัดลอกและวางลงในแผ่นจดบันทึก ++ หรือบรรณาธิการที่สนับสนุนยูนิโค้ดอื่น ๆ
ลักษณะที่แตกต่างกันระหว่างค่า ascii และ unicode ควรเห็นได้ชัดในสายตา แต่ถ้าคุณเอนไปทางทวารหนักมันจะแสดงเป็น 27 (ascii) หรือ 92 (unicode) ในโปรแกรมแก้ไข hex
พวกเราหลายคนรู้ว่าวิธีการที่ได้รับความนิยมในการหลบหนีราคาเดียวคือการทำให้พวกเขาเป็นสองเท่าได้อย่างง่ายดายเช่นด้านล่าง
PRINT 'It''s me, Arul.';
เราจะดูวิธีอื่น ๆ ของการหลีกเลี่ยงคำพูดเดียว
1. ตัวอักษร UNICODE
39 คืออักขระ UNICODE ของ Single Quote ดังนั้นเราสามารถใช้มันเหมือนด้านล่าง
PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';
2.QUOTED_IDENTIFIER
โซลูชันทางเลือกอื่นที่ง่ายและดีที่สุดคือการใช้ QUOTED_IDENTIFIER เมื่อ QUOTED_IDENTIFIER ถูกตั้งค่าเป็นปิดสตริงสามารถอยู่ในเครื่องหมายคำพูดคู่ได้ ในสถานการณ์นี้เราไม่จำเป็นต้องหลีกเลี่ยงคำพูดเดียว ดังนั้นวิธีนี้จะมีประโยชน์มากในขณะที่ใช้ค่าสตริงจำนวนมากด้วยเครื่องหมายคำพูดเดี่ยว มันจะมีประโยชน์มากในขณะที่ใช้สคริปต์ INSERT / UPDATE จำนวนมากที่มีค่าคอลัมน์ที่มีเครื่องหมายคำพูดเดี่ยว
SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;
สรุปผลการศึกษา
วิธีการดังกล่าวข้างต้นสามารถใช้ได้กับทั้ง AZURE และ On Premises
สิ่งนี้น่าจะใช้ได้
DECLARE @singleQuote CHAR
SET @singleQuote = CHAR(39)
insert into my_table values('hi, my name'+ @singleQuote +'s tim.')
เพียงแค่ใส่ 'ก่อนที่จะใส่อะไรก็ได้ มันจะเป็นเหมือนตัวละครหลบหนีใน sqlServer
ตัวอย่าง: เมื่อคุณมีสนามเป็นผมสบายดี คุณสามารถทำได้: อัปเดต my_table SET row = 'ฉันสบายดี';
สิ่งนี้น่าจะใช้ได้: ใช้แบ็กสแลชและใส่เครื่องหมายคำพูดคู่
"UPDATE my_table SET row =\"hi, my name's tim.\";
PRINT \"hi, my name's tim.\";
จะไปทำงานใน SSMS หรือไม่ มันไม่ทำงานเลยและไม่มีใครเคยบอกว่ามันใช้งานได้