Bu sözdizimi nasıl çalışır? {fn CurDate ()} veya {fn Now ()} vb.


19

Son zamanlarda SQL Server 2005 için yazılmış oldukça eski saklı yordamlar bakıyordum ve anlamadığım bir şey fark ettim. Bir tür işlev çağrısı gibi görünüyor.

Bir örnek:

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

Bu işlem, 24 saat öncesine kadar sys.objectsolan tüm satırları görüntüler create_date.

Bu sorgu için yürütme planını görüntülersem, bunun Veritabanı Altyapısı {fn Now()}ile değiştirildiğini görüyorum getdate():

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

Açıkçası, kullanmak {fn Now()}çok daha yaygındır GetDate(). Biri için ben belgesiz olduğu için veba gibi bu sözdiziminden kaçınacağım.

Yanıtlar:


25

ODBC kaçış sözdizimidir ve motor kendi uygulamasının ne olduğunu bilir ve yürütme planında gördüğünüz gibi değiştirir. Başka şeyler de var, örneğin:

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

Burada , burada , burada ve en önemlisi burada bulunan belgelere bakın . Ama lütfen bu sözdizimini araştırmayın ve öğrenmeyin; IMHO, çoğunlukla yerel sözdizimini kullanmalı ve bu şeyleri hiç duymamış gibi davranmalısınız.

Ayrıca getdate()-1, özellikle geri dönüp eski kodunu güncelliyorsanız stenoya karşı da şiddetle tavsiye ederim . DATEADDÖrtük steno yeni türlerle çalışmadığından, açık olun ve kullanın . Örneğin, şunu deneyin:

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

Sonuç:

Msg 206, Seviye 16, Durum 2, Satır 2
İşlenen türü çakışması: tarih int ile uyumsuz

Siz oradayken, kodunuzu 10 yıl sonra gerçekten korumak istiyorsanız, yarı-sütunları da ekleyebilirsiniz.


Bu kaçış sözdizimi JDBC tarafından da desteklenir.
a_horse_with_no_name
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.