Recentemente, examinei alguns procedimentos armazenados bastante antigos que foram escritos para o SQL Server 2005 e notei algo que não entendo. Parece ser algum tipo de chamada de função.
Uma amostra:
SELECT o.name, o.type_desc, o.create_date
FROM sys.objects o
WHERE o.create_date < {fn Now()} -1;
Isso exibirá todas as linhas anteriores sys.objects
a create_date
24 horas atrás.
Se eu exibir o plano de execução para esta consulta, vejo que {fn Now()}
foi substituído getdate()
pelo Mecanismo de Banco de Dados:
SELECT [o].[name],[o].[type_desc],[o].[create_date]
FROM [sys].[objects] [o]
WHERE [o].[create_date]<(getdate()-@1)
Claramente, usar {fn Now()}
é muito mais obtuso do que GetDate()
. Eu, pelo menos, evitarei essa sintaxe como uma praga, uma vez que não está documentada.
É a sintaxe de escape ODBC, e o mecanismo sabe qual é sua própria implementação e a troca, como você viu no plano de execução. Há também outras coisas, como:
Veja a documentação aqui , aqui , aqui , e o mais importante aqui . Mas, por favor, não investigue e aprenda sobre essa sintaxe; IMHO, você deve usar a sintaxe nativa na maior parte e fingir que nunca ouviu falar dessas coisas.
Também recomendo fortemente contra a
getdate()-1
abreviação, principalmente se você estiver voltando e atualizando o código antigo. Seja explícito e useDATEADD
, pois a abreviação implícita não funciona com novos tipos. Por exemplo, tente:Resultado:
Enquanto você estiver lá, também pode adicionar o ponto-e-vírgula, se você realmente deseja proteger seu código 10 anos no futuro.