Cú pháp này hoạt động như thế nào? {fn CurDate ()} hoặc {fn Now ()}, v.v.


19

Gần đây tôi đã xem qua một số quy trình được lưu trữ khá cũ được viết cho SQL Server 2005 và tôi đã nhận thấy điều gì đó mà tôi không hiểu. Nó dường như là một số loại chức năng gọi.

Một ví dụ:

SELECT o.name, o.type_desc, o.create_date
FROM sys.objects o
WHERE o.create_date < {fn Now()} -1;

Điều này sẽ hiển thị tất cả các hàng từ sys.objectsđó có create_datetrước 24 giờ trước.

Nếu tôi hiển thị kế hoạch thực hiện cho truy vấn này, tôi thấy nó {fn Now()}được thay thế getdate()bằng Cơ sở dữ liệu:

SELECT [o].[name],[o].[type_desc],[o].[create_date] 
FROM [sys].[objects] [o] 
WHERE [o].[create_date]<(getdate()-@1)

Rõ ràng, sử dụng {fn Now()}là khó hiểu hơn nhiều GetDate(). Tôi cho một người sẽ tránh cú pháp này giống như bệnh dịch vì nó không có giấy tờ.

Câu trả lời:


25

Đó là cú pháp thoát ODBC và công cụ biết triển khai của chính nó là gì và hoán đổi nó, như bạn đã thấy trong kế hoạch thực hiện. Ngoài ra còn có những thứ khác, chẳng hạn như:

SELECT {fn curdate()},
       {ts '2016-05-24 15:19:36'}, -- not vulnerable to SET LANGUAGE!
       {guid 'D08891B4-BC25-4C7C-BAEF-3B756055AC6E'};

Xem tài liệu ở đây , ở đây , ở đây , và quan trọng nhất ở đây . Nhưng xin đừng điều tra và tìm hiểu về cú pháp này; IMHO bạn nên sử dụng cú pháp riêng cho hầu hết các phần và giả vờ bạn chưa bao giờ nghe về công cụ này.

Tôi cũng đặc biệt khuyên bạn nên chống lại tốc getdate()-1ký, đặc biệt nếu bạn quay lại và cập nhật mã cũ. Hãy rõ ràng và sử dụng DATEADD, vì tốc ký ngầm không hoạt động với các loại mới. Ví dụ: thử:

DECLARE @d DATE = GETDATE();
SELECT @d - 1;

Kết quả:

Msg 206, Cấp 16, Trạng thái 2, Dòng 2
Kiểu va chạm: ngày không tương thích với int

Trong khi bạn đang ở đó, cũng có thể thêm dấu chấm phẩy nếu bạn thực sự muốn bảo vệ mã của mình sau 10 năm nữa.


Cú pháp thoát này cũng được hỗ trợ bởi JDBC.
a_horse_with_no_name
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.