Aracılığıyla paylaş


Deterministic ve nondeterministic işlevleri

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL analiz uç noktasıMicrosoft Fabric'te ambarMicrosoft Fabric'te SQL veritabanı

Belirli bir giriş değerleri kümesiyle çağrıldıklarında ve veritabanının aynı durumu verüldüğünde, belirleyici işlevler her zaman aynı sonucu döndürür. Belirli bir giriş değerleri kümesiyle çağrıldıklarında, erişdikleri veritabanı durumu aynı kalsa bile, belirsiz işlevler farklı sonuçlar döndürebilir. Örneğin, işlev AVG daha önce belirtilen nitelikler göz önüne alındığında her zaman aynı sonucu döndürür, ancak GETDATE geçerli tarih saat değerini döndüren işlev her zaman farklı bir sonuç döndürür.

SQL Server Veritabanı Altyapısı'nın işlevi çağıran hesaplanan sütunlardaki dizinler aracılığıyla veya işleve başvuran dizinli görünümler aracılığıyla işlevin sonuçlarını dizine alma becerisini belirleyen kullanıcı tanımlı işlevlerin çeşitli özellikleri vardır. Bir işlevin determinizmi böyle bir özelliktir. Örneğin, görünüm herhangi bir belirsiz işleve başvuruda bulunursa, bir görünümde kümelenmiş dizin oluşturulamaz. Determinizm de dahil olmak üzere işlevlerin özellikleri hakkında daha fazla bilgi için bkz . Kullanıcı tanımlı işlevler.

Belirleyici işlevler şemaya bağlı olmalıdır. Deterministik bir işlev oluştururken yan tümcesini SCHEMABINDING kullanın.

Bu makalede, yerleşik sistem işlevlerinin determinizmi ve genişletilmiş saklı yordamlara yönelik bir çağrı içerdiğinde kullanıcı tanımlı işlevlerin belirleyici özelliği üzerindeki etkisi tanımlanır.

bir işlevin belirleyici olup olmadığını belirleme

İşlevin object özelliğini sorgulayarak bir işlevin is_deterministic belirlenip belirlenmediğini de kontrol edebilirsiniz. Aşağıdaki örnek işlevin Sales.CalculateSalesTax belirleyici olup olmadığını belirler.

SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');

Yerleşik işlev determinizmi

Yerleşik işlevlerin determinizmini etkileyemezsiniz. Yerleşik işlevlerin her biri, işlevin SQL Server tarafından nasıl uygulandığına bağlı olarak belirleyici veya belirsiz değildir. Örneğin, sorguda yan ORDER BY tümce belirtmek, bu sorguda kullanılan bir işlevin determinizmini değiştirmez.

FORMAT dışındaki tüm yerleşik dize işlevleri belirleyicidir. Bu işlevlerin listesi için bkz. Dize İşlevleri.

Dize işlevleri dışındaki yerleşik işlevler kategorilerinden aşağıdaki yerleşik işlevler her zaman belirleyicidir.

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATN2
  • CEILING
  • COALESCE
  • COS
  • COT
  • DATALENGTH
  • DATEADD
  • DATEDIFF
  • DAY
  • DEGREES
  • EXP
  • FLOOR
  • ISNULL
  • ISNUMERIC
  • LOG
  • LOG10
  • MONTH
  • NULLIF
  • POWER
  • RADIANS
  • ROUND
  • SIGN
  • SIN
  • SQRT
  • SQUARE
  • TAN
  • YEAR

Aşağıdaki işlevler her zaman belirleyici değildir, ancak belirlenebilir bir şekilde belirtildiğinde hesaplanan sütunlardaki dizinli görünümlerde veya dizinlerde kullanılabilir.

İşlev Comments
Tüm toplama işlevleri ve yan tümceleriyle OVERORDER BY belirtilmediği sürece tüm toplama işlevleri belirleyicidir. Bu işlevlerin listesi için bkz. Toplama İşlevleri.
CAST Datetime, smalldatetime veya sql_variant ile kullanılmadığı sürece belirleyici.
CONVERT Bu koşullardan biri yoksa belirleyici:

Kaynak türü sql_variant.

Hedef türü sql_variant ve kaynak türü belirsiz değildir.

Kaynak veya hedef türü datetime veya smalldatetime, diğer kaynak veya hedef türü bir karakter dizesidir ve belirsiz bir stil belirtilir. Belirlenimci olması için stil parametresinin sabit olması gerekir. Ayrıca, 20 ve 21 stilleri dışında, 100'den küçük veya buna eşit stiller belirsiz değildir. 106, 107, 109 ve 113 stilleri dışında, 100'den büyük stiller belirleyicidir.
CHECKSUM deterministik, dışında CHECKSUM(*).
ISDATE Belirleyici yalnızca işlevle CONVERT kullanıldığında stil CONVERT parametresi belirtilir ve stil 0, 100, 9 veya 109'a eşit değildir.
RAND RAND yalnızca bir seed parametresi belirtildiğinde belirlenebilir.

Tüm yapılandırma, imleç, meta veriler, güvenlik ve sistem istatistiksel işlevleri belirsiz değildir. Bu işlevlerin listesini görebilirsiniz.

Diğer kategorilerdeki aşağıdaki yerleşik işlevler her zaman belirsiz değildir.

  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACKET_ERRORS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE
  • AT TIME ZONE
  • CUME_DIST
  • CURRENT_TIMESTAMP
  • DENSE_RANK
  • FIRST_VALUE
  • FORMAT
  • GETDATE
  • GETUTCDATE
  • GET_TRANSMISSION_STATUS
  • LAG
  • LAST_VALUE
  • LEAD
  • MIN_ACTIVE_ROWVERSION
  • NEWID
  • NEWSEQUENTIALID
  • NEXT VALUE FOR
  • NTILE
  • PARSENAME
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • PERCENT_RANK
  • RAND
  • RANK
  • ROW_NUMBER
  • TEXTPTR

İşlevlerden genişletilmiş saklı yordamları çağırma

Genişletilmiş saklı yordamlar veritabanında yan etkilere neden olabileceğinden, genişletilmiş saklı yordamları çağıran işlevler belirsiz değildir. Yan etkiler, bir tabloya yapılan güncelleştirme veya dosya ya da ağ gibi bir dış kaynak gibi veritabanının genel durumunda yapılan değişikliklerdir. Örnek olarak bir dosyayı değiştirme veya e-posta iletisi gönderme verilebilir. Kullanıcı tanımlı bir işlevden genişletilmiş saklı yordam yürütürken tutarlı bir sonuç kümesini döndürmeye güvenmeyin. Veritabanında yan etkiler oluşturan kullanıcı tanımlı işlevler önerilmez.

Bir işlevin içinden çağrıldığında, genişletilmiş saklı yordam sonuç kümelerini istemciye döndüremez. İstemciye sonuç kümeleri döndüren herhangi bir Open Data Services API'sinin dönüş kodu vardır FAIL.

Genişletilmiş saklı yordam SQL Server'a geri bağlanabilir. Ancak yordam, genişletilmiş saklı yordamı çağıran özgün işlevle aynı işlemi birleştiremez.

Toplu veya saklı yordamdaki çağrılara benzer şekilde, genişletilmiş saklı yordam SQL Server'ın çalıştığı Windows güvenlik hesabı bağlamında yürütülür. Genişletilmiş saklı yordamın sahibi, diğer kullanıcılara yordamı yürütmek için izinler verirken bu güvenlik bağlamının izinlerini dikkate almalıdır.