Próbuję insert
przenieść dane tekstowe do tabeli w SQL Server
9.
Tekst zawiera pojedynczy cytat (').
Jak mam uciec?
Próbowałem użyć dwóch pojedynczych cudzysłowów, ale rzuciło mi to trochę błędów.
na przykład. insert into my_table values('hi, my name''s tim.');
sql
sql-server
tsql
delimiter
single-quotes
tim_wonil
źródło
źródło
Odpowiedzi:
Pojedyncze cytaty są unikane przez podwojenie ich , tak jak pokazałeś nam w swoim przykładzie. Poniższy kod SQL ilustruje tę funkcjonalność. Przetestowałem to na SQL Server 2008:
Wyniki
źródło
Jeśli unikanie pojedynczego cytatu z innym pojedynczym cytatem nie działa dla Ciebie (tak jak w przypadku jednego z moich ostatnich
REPLACE()
zapytań), możesz użyćSET QUOTED_IDENTIFIER OFF
przed zapytaniem, a następnieSET QUOTED_IDENTIFIER ON
po zapytaniu.Na przykład
źródło
Co powiesz na:
źródło
Podwojenie cytatu powinno było zadziałać, więc dziwne, że nie zadziałało; alternatywą jest jednak stosowanie ciągów podwójnych cudzysłowów zamiast pojedynczych. To znaczy,
insert into my_table values("hi, my name's tim."
);źródło
2 sposoby obejścia tego:
za
'
po prostu można podwoić w ciągu, npselect 'I''m happpy'
- dostanie:I'm happy
Dla dowolnego charaktera nie jesteś pewien: na serwerze sql możesz uzyskać kod Unicode dowolnego char
select unicode(':')
(zachowujesz numer)Więc ten przypadek możesz również
select 'I'+nchar(39)+'m happpy'
źródło
Kolejną rzeczą, na którą należy uważać, jest to, czy naprawdę jest przechowywana jako klasyczny ASCII '(ASCII 27) lub Unicode 2019 (który wygląda podobnie, ale nie tak samo).
Nie jest to wielka sprawa na temat wkładek, ale może oznaczać świat na wybranych i aktualizacjach.
Jeśli jest to wartość Unicode, wówczas ucieczka od „w klauzuli WHERE” (np. Gdzie blah = „Workers's Comp”) zwróci, tak jakby szukana wartość nie istniała, jeśli „in” Worker Comp ” wartość Unicode.
Jeśli twoja aplikacja kliencka obsługuje dane wejściowe oparte na wolnym kluczu, a także kopiowaniu i wklejaniu, może to być Unicode w niektórych wierszach i ASCII w innych!
Prostym sposobem na potwierdzenie tego jest wykonanie jakiegoś otwartego zapytania, które przywróci poszukiwaną wartość, a następnie skopiowanie i wklejenie go do notatnika ++ lub innego edytora obsługującego Unicode.
Różnice w wyglądzie między wartością ascii a wartością Unicode powinny być oczywiste dla oczu, ale jeśli pochylisz się w kierunku odbytu, pojawi się on jako 27 (ascii) lub 92 (Unicode) w edytorze szesnastkowym.
źródło
Wielu z nas wie, że popularną metodą unikania pojedynczych cytatów jest ich podwajanie, tak jak poniżej.
przyjrzymy się innym alternatywnym sposobom unikania pojedynczych cytatów.
1. znaki UNICODE
39 to UNIKODOWY znak pojedynczego cytatu. Możemy więc użyć go jak poniżej.
2.QUOTED_IDENTIFIER
Innym prostym i najlepszym alternatywnym rozwiązaniem jest użycie QUOTED_IDENTIFIER. Gdy QUOTED_IDENTIFIER jest ustawiony na OFF, ciągi znaków mogą być ujęte w podwójne cudzysłowy. W tym scenariuszu nie musimy uciekać przed pojedynczymi cudzysłowami. Tak więc ten sposób byłby bardzo pomocny przy użyciu wielu wartości ciągów z pojedynczymi cudzysłowami. Będzie to bardzo pomocne podczas korzystania z tak wielu wierszy skryptów INSERT / UPDATE, w których wartości kolumn mają pojedyncze cudzysłowy.
WNIOSEK
Powyższe metody mają zastosowanie zarówno do AZURE, jak i do lokali.
źródło
Poniższa składnia uniknie TYLKO JEDNEGO cudzysłowu:
Rezultatem będzie pojedynczy cytat. Może być bardzo pomocny przy tworzeniu dynamicznego SQL :).
źródło
To powinno działać
źródło
Po prostu wstaw „przed czymkolwiek do wstawienia”. Będzie to jak znak ucieczki w sqlServer
Przykład: gdy masz pole as, nic mi nie jest . możesz zrobić: UPDATE my_table SET row = 'I'm w porządku.';
źródło
To powinno zadziałać: użyj odwrotnego ukośnika i wstaw podwójny cytat
źródło
PRINT \"hi, my name's tim.\";
będzie działać w SSMS? To w ogóle nie działa i nikt nigdy nie powiedział, że to działa.