Récemment, j'ai examiné certaines procédures stockées assez anciennes qui ont été écrites pour SQL Server 2005 et j'ai remarqué quelque chose que je ne comprends pas. Il semble s'agir d'un type d'appel de fonction.
Un échantillon:
SELECT o.name, o.type_desc, o.create_date
FROM sys.objects o
WHERE o.create_date < {fn Now()} -1;
Cela affichera toutes les lignes de sys.objects
Qui ont un create_date
Avant 24 heures.
Si j'affiche le plan d'exécution pour cette requête, je vois que {fn Now()}
est remplacé par getdate()
par le moteur de base de données:
SELECT [o].[name],[o].[type_desc],[o].[create_date]
FROM [sys].[objects] [o]
WHERE [o].[create_date]<(getdate()-@1)
Clairement, en utilisant {fn Now()}
est beaucoup plus obtuse que GetDate()
. Pour que je puisse éviter cette syntaxe comme la peste car elle est sans papule.
C'est =ODBC Syntaxe d'échappement, et le moteur sait que sa propre implémentation est et que vous sortez, comme vous l'avez vu dans le plan d'exécution. Il y a aussi d'autres choses, telles que:
SELECT {fn curdate()},
{ts '2016-05-24 15:19:36'}, -- not vulnerable to SET LANGUAGE!
{guid 'D08891B4-BC25-4C7C-BAEF-3B756055AC6E'};
Voir la documentation ICI , ICI , ICI , et surtout (( ici . Mais s'il vous plaît, n'enquêtez pas et découvrez cette syntaxe; IMHO Vous devez utiliser la syntaxe natale pour la plupart et prétendre que vous n'avez jamais entendu parler de ce genre de choses.
Je recommande également fortement contre le getdate()-1
Shorthand, en particulier, en particulier si vous revenez et mettez à jour l'ancien code. Soyez explicite et utilisez DATEADD
, car le sténographie implicite ne fonctionne pas avec de nouveaux types. Par exemple, essayez:
DECLARE @d DATE = GETDATE();
SELECT @d - 1;
Résultat:
MSG 206, niveau 16, état 2, ligne 2
CLASH DE TYPE DE TYPE: La date est incompatible avec int
Pendant que vous êtes là, vous pouvez également ajouter les semi-colons également si vous voulez vraiment protéger votre code 10 ans dans le futur.