ไวยากรณ์นี้ทำงานอย่างไร {fn CurDate ()} หรือ {fn Now ()} ฯลฯ


19

เมื่อเร็ว ๆ นี้ฉันได้ดูกระบวนการที่เก็บไว้ค่อนข้างเก่าที่เขียนขึ้นสำหรับ SQL Server 2005 และฉันสังเกตเห็นสิ่งที่ฉันไม่เข้าใจ ดูเหมือนจะเป็นการเรียกใช้ฟังก์ชันบางประเภท

ตัวอย่าง:

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

สิ่งนี้จะแสดงแถวทั้งหมดจากsys.objectsที่มีcreate_dateก่อนหน้า 24 ชั่วโมงที่ผ่านมา

ถ้าฉันแสดงแผนการดำเนินการสำหรับแบบสอบถามนี้ฉันเห็นว่า{fn Now()}ถูกแทนที่ด้วยgetdate()โปรแกรมฐานข้อมูล:

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

เห็นได้ชัดว่าใช้อยู่ไกลป้านมากกว่า{fn Now()} GetDate()ฉันหนึ่งจะหลีกเลี่ยงไวยากรณ์นี้เช่นกาฬโรคเพราะมันไม่มีเอกสาร

คำตอบ:


25

มันคือไวยากรณ์การหลบหนีของ ODBC และเอ็นจิ้นรู้ว่าการนำไปปฏิบัติของมันคืออะไรและสลับมันออกมาดังที่คุณเห็นในแผนปฏิบัติการ นอกจากนี้ยังมีสิ่งอื่น ๆ เช่น:

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

โปรดดูเอกสารที่นี่ , ที่นี่ , ที่นี่และที่สำคัญที่สุดที่นี่ แต่โปรดอย่าตรวจสอบและเรียนรู้เกี่ยวกับไวยากรณ์นี้ IMHO คุณควรใช้ไวยากรณ์ดั้งเดิมเป็นส่วนใหญ่และทำเป็นว่าคุณไม่เคยได้ยินเรื่องนี้มาก่อน

ฉันขอแนะนำอย่างยิ่งกับgetdate()-1ชวเลขด้วยโดยเฉพาะอย่างยิ่งถ้าคุณจะกลับไปและอัปเดตรหัสเก่า มีความชัดเจนและใช้DATEADDเนื่องจากชวเลขโดยนัยไม่ทำงานกับชนิดใหม่ ตัวอย่างเช่นลอง:

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

ผลลัพธ์:

ข่าวสารเกี่ยวกับ 206 ระดับ 16 สถานะ 2 สาย 2 ตัวดำเนินการ
ชนิดปะทะ: วันที่เข้ากันไม่ได้กับ int

ในขณะที่คุณอยู่ที่นั่นอาจเพิ่มเซมิโคลอนด้วยเช่นกันหากคุณต้องการปกป้องรหัสของคุณในอนาคต 10 ปี


ไวยากรณ์การหลบหนีนี้ได้รับการสนับสนุนโดย JDBC เช่นกัน
a_horse_with_no_name
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.