Làm cách nào để thoát một trích dẫn trong SQL Server?


956

Tôi đang cố gắng để insertmột số dữ liệu văn bản vào một bảng trong SQL Server9.

Văn bản bao gồm một trích dẫn (').

Làm thế nào để tôi thoát khỏi điều đó?

Tôi đã thử sử dụng hai dấu ngoặc đơn, nhưng nó đã gây ra một số lỗi.

ví dụ. insert into my_table values('hi, my name''s tim.');


30
"Nó đã ném cho tôi một số lỗi" - Những lỗi này là gì?
llamaoo7

Có bởi vì cách đúng để chèn các trích dẫn đơn trong MSSQL là nhân đôi chúng. Ví dụ bạn chỉ cho chúng tôi nên làm việc. Làm thế nào để bạn thực hiện truy vấn SQL này, với ngôn ngữ nào? Hoặc là trong SQL Server Management Studio?
MaxiWheat

Câu trả lời:


1388

Các trích dẫn đơn được thoát bằng cách nhân đôi chúng lên , giống như bạn đã cho chúng tôi thấy trong ví dụ của bạn. SQL sau đây minh họa chức năng này. Tôi đã thử nghiệm nó trên SQL Server 2008:

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

Các kết quả

value
==================
hi, my name's tim.

16
tôi đã nhìn nhầm chỗ để khắc phục vấn đề của mình. Rốt cuộc nó không phải là một vấn đề thoát nhân vật. vấn đề của tôi là chiều dài dữ liệu đã vượt quá giới hạn. cảm ơn vì đã trấn an tôi rằng sử dụng trích dẫn hai lần là cách thoát khỏi nhân vật.
tim_wonil

Vì vậy, nếu tôi có một văn bản chứa 10k từ thì tôi có cần thay thế tất cả văn bản của mình không?
Vinicius Lima

3
@ViniciusLima: Câu trả lời ngắn gọn là có. Điều đó sẽ thay đổi tất nhiên tùy thuộc vào công nghệ bạn sẽ sử dụng để lưu trữ dữ liệu. Nếu bạn đang sử dụng ORM, nó sẽ giúp bạn. Nếu bạn đang xây dựng các lệnh SQL của mình theo cách thủ công, bạn sẽ muốn sử dụng chức năng "tuyên bố đã chuẩn bị" của ngôn ngữ. Nếu bạn đang làm điều đó trong Management Studio thì bạn sẽ phải thay thế.
Cᴏʀʏ

1
tức là hai trích dẫn đơn cho một. [''] => [']
Ujjwal Singh

67

Nếu thoát một trích dẫn của bạn bằng một trích dẫn khác không hiệu quả với bạn (như nó không có trong một trong những REPLACE()truy vấn gần đây của tôi ), bạn có thể sử dụng SET QUOTED_IDENTIFIER OFFtrước truy vấn của mình, sau đó là SET QUOTED_IDENTIFIER ONtruy vấn của bạn.

Ví dụ

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
Thông thường tôi sử dụng cách tiếp cận nhân đôi, nhưng khi tôi tạo SQL động được chạy trên nhiều máy chủ và cơ sở dữ liệu, giải pháp này hiệu quả với tôi trong khi việc nhân đôi không xảy ra trong một trường hợp cụ thể. Cám ơn vì cái này!
Richard Moss

Hãy cẩn thận khi tham chiếu các khung nhìn và chỉ mục trên các cột được tính toán hoặc bạn có thể gặp lỗi. stackoverflow.com/questions/9235527/ từ
datagod

@RichardMoss, +1. cùng kịch bản với bạn. tăng gấp đôi cách tiếp cận là giải pháp ban đầu. Đối với các truy vấn phức tạp như SQL động trên nhiều máy chủ, điều này sẽ hoạt động, cách tiếp cận tăng gấp đôi có thể không
Edgar Allan Bayron

48

Làm thế nào về:

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

18
sử dụng char (39) thay vào đó
Iswanto San

17

Việc nhân đôi trích dẫn đáng lẽ phải có hiệu quả, vì vậy thật kỳ lạ khi nó không hiệu quả với bạn; tuy nhiên, một cách khác là sử dụng các ký tự trích dẫn kép, thay vì các ký tự đơn, xung quanh chuỗi. I E,

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


4
Điều gì nếu văn bản chứa cả dấu ngoặc đơn và dấu ngoặc kép? Ngoài ra, không phải trích dẫn kép chỉ dành riêng cho tên trường?
Lajos Meszaros

11

2 cách để giải quyết vấn đề này:


đối với 'bạn có thể chỉ cần nhân đôi nó trong chuỗi, ví dụ select 'I''m happpy'- sẽ nhận được:I'm happy


Đối với bất kỳ charactor nào bạn không chắc chắn: trong máy chủ sql, bạn có thể nhận được bất kỳ unicode nào bằng cách select unicode(':')(bạn giữ số)

Vì vậy, trường hợp này bạn cũng có thể select 'I'+nchar(39)+'m happpy'


6

Ngoài ra, một điều nữa cần cẩn thận là liệu nó có thực sự được lưu trữ dưới dạng ASCII cổ điển '(ASCII 27) hay Unicode 2019 (trông giống nhau, nhưng không giống nhau).

Đây không phải là một vấn đề lớn đối với các phần chèn, nhưng nó có thể có nghĩa là thế giới về các lựa chọn và cập nhật.
Nếu đó là giá trị unicode thì thoát khỏi 'trong mệnh đề WHERE (ví dụ: blah =' Compers''s Comp ') sẽ trả về giống như giá trị bạn đang tìm kiếm không có ở đó nếu' trong "Worker Comp" thực sự là giá trị unicode.

Nếu ứng dụng khách của bạn hỗ trợ khóa tự do, cũng như sao chép và dán đầu vào dựa trên, thì đó có thể là Unicode ở một số hàng và ASCII ở các hàng khác!

Một cách đơn giản để xác nhận điều này là bằng cách thực hiện một số loại truy vấn kết thúc mở sẽ mang lại giá trị bạn đang tìm kiếm, sau đó sao chép và dán nó vào notepad ++ hoặc một trình soạn thảo hỗ trợ unicode khác.

Sự xuất hiện khác nhau giữa giá trị ascii và unicode nên rõ ràng đối với mắt, nhưng nếu bạn nghiêng về phía hậu môn, nó sẽ hiển thị là 27 (ascii) hoặc 92 (unicode) trong trình chỉnh sửa hex.


4

Nhiều người trong chúng ta biết rằng Phương pháp phổ biến để thoát các trích dẫn đơn là bằng cách nhân đôi chúng lên dễ dàng như dưới đây.

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

Nhân đôi phương pháp trích dẫn đơn

chúng ta sẽ xem xét một số cách khác để thoát khỏi dấu ngoặc đơn.

1.UNICODE Nhân vật

39 là nhân vật UNICODE của Trích dẫn đơn. Vì vậy, chúng ta có thể sử dụng nó như dưới đây.

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

Nhân vật UNICODE

2.QUOTED_IDENTIFIER

Một giải pháp thay thế đơn giản và tốt nhất khác là sử dụng QUOTED_IDENTIFIER. Khi QUOTED_IDENTIFIER được đặt thành TẮT, các chuỗi có thể được đặt trong dấu ngoặc kép. Trong kịch bản này, chúng ta không cần phải thoát dấu ngoặc đơn. Vì vậy, cách này sẽ rất hữu ích trong khi sử dụng nhiều giá trị chuỗi với dấu ngoặc đơn. Nó sẽ rất hữu ích trong khi sử dụng rất nhiều dòng script INSERT / UPDATE trong đó các giá trị cột có dấu ngoặc đơn.

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

QUOTE_IDENTIFIER

PHẦN KẾT LUẬN

Các phương pháp được đề cập ở trên có thể áp dụng cho cả AZURE và tại cơ sở.


1

Cú pháp sau đây sẽ thoát khỏi bạn CHỈ MỘT dấu ngoặc kép:

SELECT ''''

Kết quả sẽ là một trích dẫn duy nhất. Có thể rất hữu ích cho việc tạo SQL động :). nhập mô tả hình ảnh ở đây


0

Điều này sẽ làm việc

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

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

0

Chỉ cần chèn một 'trước khi bất cứ điều gì được chèn. Nó sẽ giống như một nhân vật thoát trong sqlServer

Ví dụ: Khi bạn có một lĩnh vực như, tôi ổn . bạn có thể làm: CẬP NHẬT my_table SET row = 'Tôi ổn.';


Đó không phải là chính xác những gì OP đã làm, và giống như câu trả lời được bình chọn hàng đầu đã nói? Có lẽ phải có một số nguồn khác của lỗi.
Michael MacAskill

-2

Điều này sẽ hoạt động: sử dụng dấu gạch chéo ngược và đặt dấu ngoặc kép

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

Ý anh là gì? Bạn đang nói rằng PRINT \"hi, my name's tim.\";sẽ làm việc trong SSMS? Nó hoàn toàn không hoạt động và không ai từng nói rằng nó hoạt động.
Mohammad Musavi

Sẽ không bao giờ làm việc.
Santosh Jadi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.