Ký tự thoát trong SQL Server


93

Tôi muốn sử dụng dấu ngoặc kép với ký tự thoát. Làm thế nào tôi có thể làm được?

Tôi đã nhận được lỗi trong SQL Server

Dấu ngoặc kép mở sau chuỗi ký tự.

Tôi đang viết truy vấn SQL trong một varcharbiến nhưng tôi đã nhận được lỗi đó:

Dấu ngoặc kép mở sau chuỗi ký tự.

Tôi muốn sử dụng dấu ngoặc kép làm ký tự thoát.


4
Bạn có thể vui lòng chỉ cho chúng tôi câu hỏi được không ??
marc_s

Câu trả lời:


72

Trốn thoát ' bạn cần đặt một cái khác trước:''

Như câu trả lời thứ hai cho thấy có thể thoát khỏi một trích dẫn đơn lẻ như thế này:

select 'it''s escaped'

kết quả sẽ là

it's escaped

Nếu bạn đang nối SQL vào một VARCHAR để thực thi (tức là SQL động), thì tôi khuyên bạn nên tạo tham số cho SQL. Điều này có lợi ích là giúp bảo vệ chống lại SQL injection, đồng nghĩa với việc bạn không phải lo lắng về việc thoát khỏi các dấu ngoặc kép như thế này (bạn làm bằng cách tăng gấp đôi các dấu ngoặc kép).

ví dụ thay vì làm

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = ''AAA'''
EXECUTE(@SQL)

thử cái này:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'

29
Tại sao đây là câu trả lời được chấp nhận? Nó không trả lời câu hỏi.
Peter Moore

3
@PeterMoore Hoặc OP sẽ sử dụng phần đầu tiên trong câu trả lời của tôi (tăng gấp đôi các dấu ngoặc kép, theo các câu trả lời khác bên dưới) hoặc sẽ sử dụng cách tiếp cận ưa thích mà tôi đã đề xuất để tạo truy vấn SQL trong một biến chuỗi - sử dụng tham số hóa SQL. Dù bằng cách nào, cả hai đều là những câu trả lời cho câu hỏi
AdaTheDev

Nó không trả lời câu hỏi. Đôi khi người dùng cần kết nối ODBC có nghĩa là bạn chỉ có thể sử dụng SQL thuần túy.
Tony

Thay đổi nội dung câu trả lời cho nó càng rõ ràng hơn và tốt hơn phù hợp với những câu hỏi
Revious

121

Bạn có thể thoát khỏi báo giá như thế này:

select 'it''s escaped'

kết quả sẽ là

it's escaped

Đây nên là câu trả lời.
Tony

43

Bạn có thể xác định ký tự thoát của mình, nhưng bạn chỉ có thể sử dụng nó với một LIKEmệnh đề.

Thí dụ:

SELECT columns FROM table
WHERE column LIKE '%\%%' ESCAPE '\'

Ở đây nó sẽ tìm kiếm %trong toàn bộ chuỗi và đây là cách người ta có thể sử dụng mã ESCAPEđịnh danh trong SQL Server.


21

Bạn chỉ cần thay thế 'bằng ''bên trong chuỗi của mình

SELECT colA, colB, colC
FROM tableD
WHERE colA = 'John''s Mobile'

Bạn cũng có thể sử dụng REPLACE(@name, '''', '''''')nếu tạo SQL động

Nếu bạn muốn thoát bên trong một câu lệnh like thì bạn cần sử dụng cú pháp ESCAPE

Cũng cần nhắc lại rằng bạn đang để mặc cho các cuộc tấn công SQL injection nếu bạn không cân nhắc. Thông tin thêm tại Google hoặc: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F


và câu trả lời của dugokontov hoặc RichardPianka không có bất kỳ -1 tương tự?
Seph

@MichaelMunsey hãy tự mình thử: select 'trả về lỗi Unclosed quotation mark after the character string ''. Không có câu trả lời nào trong câu trả lời của tôi mà tôi "chỉ sử dụng hai ', không chắc tại sao câu trả lời của tôi là câu trả lời duy nhất có số phiếu giảm.
Seph

12

Việc thoát dấu ngoặc kép trong MSSQL được thực hiện bằng dấu ngoặc kép, do đó, a ''hoặc a ""sẽ tạo ra một dấu ngoặc kép '"tương ứng.


0

Bạn có thể sử dụng **\**ký tự trước giá trị bạn muốn thoát, ví dụ: insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'


0

Nếu bạn muốn thoát khỏi đầu vào của người dùng trong một biến, bạn có thể làm như bên dưới trong SQL

  Set @userinput = replace(@userinput,'''','''''')

@Userinput bây giờ sẽ được thoát với một dấu ngoặc kép bổ sung cho mỗi lần xuất hiện một câu trích dẫn



-2

Để giữ cho mã dễ đọc, bạn có thể sử dụng dấu ngoặc vuông []để trích dẫn chuỗi chứa 'hoặc ngược lại.


Điều này là không đúng. Dấu ngoặc hoạt động trên các ký tự không hợp lệ trong tên trường, bảng hoặc lược đồ.
Jamie Marshall

Vâng, bạn đúng, nó dành cho tên đối tượng, không phải nội dung chuỗi. Tôi phải đọc câu hỏi sai.
Ben
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.