Come funziona questa sintassi? {fn CurDate ()} o {fn Now ()} ecc


19

Di recente ho esaminato alcune stored procedure piuttosto vecchie scritte per SQL Server 2005 e ho notato qualcosa che non capisco. Sembra essere un tipo di chiamata di funzione.

Un campione:

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

Questo mostrerà tutte le righe sys.objectsche hanno avuto create_dateprima di 24 ore fa.

Se visualizzo il piano di esecuzione per questa query, vedo che {fn Now()}viene sostituito getdate()dal Motore di database:

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

Chiaramente, l'utilizzo {fn Now()}è molto più ottuso di GetDate(). Io per primo eviterò questa sintassi come la peste poiché non è documentata.

Risposte:


25

È la sintassi di escape ODBC e il motore sa qual è la propria implementazione e la scambia, come hai visto nel piano di esecuzione. Ci sono anche altre cose, come:

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

Vedi la documentazione qui , qui , qui e, soprattutto, qui . Ma per favore non indagare e conoscere questa sintassi; IMHO dovresti usare la sintassi nativa per la maggior parte e far finta di non aver mai sentito parlare di queste cose.

Consiglio vivamente anche contro la getdate()-1stenografia, in particolare se torni indietro e aggiorni il vecchio codice. Sii esplicito e usa DATEADD, poiché la scorciatoia implicita non funziona con nuovi tipi. Ad esempio, prova:

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

Risultato:

Messaggio 206, livello 16, stato 2, riga 2
Operando tipo scontro: la data non è compatibile con int

Mentre sei lì, puoi anche aggiungere i punti e virgola, anche se vuoi davvero proteggere il tuo codice 10 anni nel futuro.


Questa sintassi di escape è supportata anche da JDBC.
a_horse_with_no_name
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.