Як працює цей синтаксис? {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;

Результат:

Msg 206, рівень 16, стан 2, рядок 2
зіткнення типу операнда: дата несумісна з int

Поки ви там, можете також додати напівколонки, якщо ви дійсно хочете захистити свій код 10 років у майбутньому.


Цей синтаксис втечі підтримується також JDBC.
a_horse_with_no_name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.