Як уникнути єдиної цитати в SQL Server?


956

Я намагаюся ввести insertдеякі текстові дані в таблицю в SQL Server9.

Текст включає єдину цитату (').

Як мені це уникнути?

Я спробував використати дві одиничні лапки, але це принесло мені деякі помилки.

напр. insert into my_table values('hi, my name''s tim.');


30
"це кинуло мені деякі помилки" - Що це за помилки?
llamaoo7

Так, тому що правильний спосіб вставити одиничні лапки в MSSQL - це їх подвоїти. Приклад, який ви нам показуєте, повинен працювати. Як зробити цей SQL-запит, за допомогою якої мови? Або це в студії управління SQL Server?
MaxiWheat

Відповіді:


1387

Окремі цитати виходять, подвоївши їх , як ви показали нам у своєму прикладі. Наступний 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.

16
я шукав неправильне місце, щоб виправити свою проблему. врешті-решт це не було проблемою втечі персонажа. моє питання полягало в тому, що довжина даних перевищила ліміт. дякую за те, що запевнили мене, що два рази використовувати єдину цитату - це правильний спосіб уникнути символу.
tim_wonil

Отже, якщо у мене є текст, що містить 10 клів, потрібно буде замінити весь текст?
Вініцій Ліма

3
@ViniciusLima: коротка відповідь - так. Це зміниться, звичайно, залежно від технології, яку ви збираєтесь використовувати для зберігання даних. Якщо ви використовуєте ORM, він зробить це за вас. Якщо ви створюєте команди SQL вручну, вам потрібно використовувати функцію "підготовлені заяви" на мові. Якщо ви робите це в студії менеджменту, то вам доведеться зробити заміну.
Cᴏʀʏ

1
тобто дві одиничні лапки за одну. [''] => [']
Ujjwal Singh

67

Якщо уникнення вашої єдиної цитати з іншою єдиною цитатою не працює для вас (як це не було для одного з моїх останніх 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

2
Зазвичай я використовую подвоєний підхід, але там, де я генерував динамічний SQL, який потім використовувався на декількох серверах і базах даних, це рішення працювало для мене, тоді як подвоєння не було в одному конкретному випадку. Дякую за це!
Річард Мосс

Будьте уважні, посилаючись на представлення даних і покажчиків на обчислені стовпці, або ви можете отримати помилку. stackoverflow.com/questions/9235527 / ...
datagod

@RichardMoss, +1. такий же сценарій з вами. подвійний підхід - початкове рішення. Для складних запитів, таких як динамічний SQL на декількох серверах, це спрацює, подвійний підхід може не робити
Едгар Аллан Байрон

48

Як щодо:

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

18
використовуйте замість цього char (39)
Iswanto San

17

Подвоєння цитати повинно спрацювати, тому дивно, що це не спрацювало для вас; однак альтернативою є використання символів подвійного цитування, а не одиничних навколо рядка. Тобто,

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


4
Що робити, якщо текст містить однократні та подвійні лапки? Також, чи не подвійні лапки зарезервовані лише для імен полів?
Lajos Meszaros

11

2 способи подолати це:


для 'вас може просто подвоїти його в рядку, наприклад , select 'I''m happpy'- отримаєте:I'm happy


Для будь-якого charactor ви не впевнені: на sql сервері ви можете отримати unicode будь-якого char від select unicode(':') (ви зберігаєте номер)

Тож цей ви також можете select 'I'+nchar(39)+'m happpy'


6

Також слід бути обережним, чи він справді зберігається як класичний ASCII '(ASCII 27) або Unicode 2019 (який схожий, але не той самий).

Це не велика справа щодо вставок, але це може означати світ щодо вибору та оновлень.
Якщо це значення unicode, то уникнення пункту "в пункті WHERE (наприклад, де blah =" Workers''s Comp ") повернеться як значення, яке ви шукаєте, чи немає, якщо" в "Worker's Comp" насправді є значення unicode.

Якщо ваша клієнтська програма підтримує функцію вільного ключа, а також копіювати та вставляти на основі введення, це може бути Unicode в деяких рядах, а ASCII в інших!

Простий спосіб підтвердити це, виконавши якийсь відкритий запит, який поверне значення, яке ви шукаєте, а потім скопіюйте та вставте його в блокнот ++ чи інший редактор, що підтримує unicode.

Різна зовнішність між значенням ascii та unicode має бути очевидною для очей, але якщо ви схилитесь до анального, він з’явиться як 27 (ascii) або 92 (unicode) у шестигранному редакторі.


4

Багато хто з нас знає, що Популярний метод уникнення одиночних котирувань - це подвоєння їх легко, як нижче.

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

Спосіб подвоєння єдиних лапок

ми розглянемо інші альтернативні способи виходу з єдиних цитат.

1. UNICODE Персонажі

39 є символом UNICODE Єдиної котировки. Тож ми можемо використовувати його як нижче.

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

UNICODE Персонажі

2.QUOTED_IDENTIFIER

Ще одне просте і найкраще альтернативне рішення - використовувати QUOTED_IDENTIFIER. Коли для QUOTED_IDENTIFIER встановлено значення OFF, рядки можуть бути укладені у подвійні лапки. У цьому сценарії нам не потрібно уникати одиничних цитат. Отже, цей спосіб був би дуже корисним при використанні безлічі рядкових значень з одинарними лапками. Це буде дуже корисно при використанні стільки рядків сценаріїв ВСТАВИТЬ / ОНОВЛЕННЯ, де значення стовпців мають одиничні лапки.

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

QUOTE_IDENTIFIER

ВИСНОВОК

Вищезазначені методи застосовні як для AZURE, так і для приміщень.


1

Наступний синтаксис дозволить вам уникнути ТІЛЬКИ ОДНА лапки:

SELECT ''''

Результатом стане одна ціна. Можливо, це буде дуже корисно для створення динамічного SQL :). введіть тут опис зображення


0

Це має спрацювати

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

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

0

Просто вставте 'перед тим, як щось вставити. Це буде схоже на символ втечі в sqlServer

Приклад: Коли у вас є поле як, я добре . ви можете зробити: UPDATE my_table SET row = 'Я добре.';


Хіба це не саме те, що зробила ОП, і те саме, що вже говориться у відповідях на голоси? Імовірно, мала бути якесь інше джерело помилки.
Майкл

-2

Це має спрацювати: скористайтеся зворотною косою рисою і поставте подвійну цитату

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

Що ви маєте на увазі? Ви говорите, що PRINT \"hi, my name's tim.\";будете працювати в SSMS? Це зовсім не працює, і ніхто ніколи не говорив, що це працює.
Мухаммед Мусаві

Ніколи не вийде.
Сантош Джаді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.