كيف أهرب من اقتباس واحد في SQL Server؟
-
22-09-2019 - |
سؤال
أنا أحاول 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' -- will get: I'm happy
لأي Charactor ، لست متأكدًا من: في SQL Server ، يمكنك الحصول على أي unicode من char select unicode(':')
لذلك يمكنك أيضًا select 'I'+nchar(39)+'m happpy'
أيضًا شيء آخر يجب توخي الحذر هو ما إذا كان يتم تخزينه حقًا كـ ASCII كلاسيكي (ASCII 27) أو Unicode 2019 (الذي يبدو متشابهاً ، ولكن ليس هو نفسه).
هذه ليست مشكلة كبيرة على الإدراج ، ولكنها قد تعني العالم على الاختيار والتحديثات.
إذا كانت قيمة Unicode ، فإن الهروب من "في A" ، على سبيل المثال ، سيعود بند (على سبيل المثال ، "بلاه =" العمال ") مثل القيمة التي تبحث عنها ليس موجودًا إذا كانت" في "شركات العامل" هي في الواقع هي قيمة يونيكود.
إذا كان تطبيق العميل الخاص بك يدعم المفتاح الحر ، بالإضافة إلى الإدخال القائم على النسخ واللصق ، فقد يكون ذلك في بعض الصفوف ، و ASCII في الآخرين!
هناك طريقة بسيطة لتأكيد ذلك عن طريق القيام بنوع من الاستعلام المفتوح الذي سيعيد القيمة التي تبحث عنها ، ثم نسخها ولصقها في Notepad ++ أو محرر دعم Unicode الآخر.
يجب أن يكون المظهر المتنوع بين قيمة ASCII و Unicode واضحًا للعينين ، ولكن إذا كنت تميل نحو الشرج ، فسيظهر 27 (ASCII) أو 92 (Unicode) في محرر Hex.
يجب أن يعمل هذا: استخدم مائلة للخلف ووضع اقتباس مزدوج
"UPDATE my_table SET row =\"hi, my name's tim.\";
هذا يجب أن يعمل
DECLARE @singleQuote CHAR
SET @singleQuote = CHAR(39)
insert into my_table values('hi, my name'+ @singleQuote +'s tim.')
فقط أدخل "قبل أي شيء ليتم إدراجه. سيكون مثل شخصية الهروب في SQLServer
مثال: عندما يكون لديك حقل ، أنا بخير. يمكنك القيام بذلك: تحديث my_table set row = "أنا بخير. '؛
string value = "Abhishek's";
value = Replace(value,"'","''");