Sdílet prostřednictvím


Deterministické a nedeterministické funkce

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLKoncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Deterministické funkce vždy vrací stejný výsledek pokaždé, když se volají s konkrétní sadou vstupních hodnot a vzhledem ke stejnému stavu databáze. Nedeterministické funkce můžou při každém zavolání vrátit různé výsledky s konkrétní sadou vstupních hodnot, i když stav databáze, ke kterému přistupují, zůstane stejný. Například funkce AVG vždy vrátí stejný výsledek s ohledem na kvalifikaci uvedenou dříve, ale GETDATE funkce, která vrací aktuální hodnotu datetime, vždy vrátí jiný výsledek.

Existuje několik vlastností uživatelem definovaných funkcí, které určují schopnost databázového stroje SQL Serveru indexovat výsledky funkce, a to buď prostřednictvím indexů ve vypočítaných sloupcích, které funkci volají, nebo prostřednictvím indexovaných zobrazení odkazovaných na danou funkci. Determinismus funkce je jednou z těchto vlastností. Například clusterovaný index nelze vytvořit v zobrazení, pokud zobrazení odkazuje na žádné nedeterministické funkce. Další informace o vlastnostech funkcí, včetně determinismu, naleznete v tématu Uživatelem definované funkce.

Deterministické funkce musí být vázané na schéma. Klauzuli SCHEMABINDING použijte při vytváření deterministické funkce.

Tento článek identifikuje determinismus předdefinovaných systémových funkcí a vliv na deterministické vlastnosti uživatelem definovaných funkcí, pokud obsahuje volání rozšířených uložených procedur.

Určení, jestli je funkce deterministická

Pomocí dotazu na vlastnost objektu is_deterministic pro funkci můžete zkontrolovat, zda je funkce deterministická. Následující příklad určuje, zda je funkce Sales.CalculateSalesTax deterministická.

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

Determinismus předdefinovaných funkcí

Determinismus žádné předdefinované funkce nemůžete ovlivnit. Každá integrovaná funkce je deterministická nebo nedeterministická na základě způsobu implementace funkce SQL Serverem. Například zadání ORDER BY klauzule v dotazu nemění determinismus funkce, která se v tomto dotazu používá.

Všechny předdefinované funkce řetězců jsou deterministické, s výjimkou funkce FORMAT. Seznam těchto funkcí najdete v tématu Řetězcové funkce.

Následující předdefinované funkce z kategorií předdefinovaných funkcí kromě řetězcových funkcí jsou vždy deterministické.

  • 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

Následující funkce nejsou vždy deterministické, ale dají se použít v indexovaných zobrazeních nebo indexech u počítaných sloupců, když jsou zadané deterministickým způsobem.

Funkce Comments
Všechny agregační funkce Všechny agregační funkce jsou deterministické, pokud nejsou zadané pomocí OVER klauzulí a ORDER BY klauzulí. Seznam těchto funkcí najdete v tématu Agregační funkce.
CAST Deterministické, pokud se nepoužívá s datetime, smalldatetime nebo sql_variant.
CONVERT Deterministické, pokud neexistuje jedna z těchto podmínek:

Typ zdroje je sql_variant.

Cílový typ je sql_variant a jeho zdrojový typ je nedeterministický.

Zdrojový nebo cílový typ je datetime nebo smalldatetime, druhý zdroj nebo cílový typ je řetězec znaku a je určen nedeterministický styl. Aby byl deterministický, parametr stylu musí být konstanta. Kromě toho jsou styly menší než nebo rovno 100 nedeterministické, s výjimkou stylů 20 a 21. Styly větší než 100 jsou deterministické, s výjimkou stylů 106, 107, 109 a 113.
CHECKSUM Deterministické, s výjimkou CHECKSUM(*).
ISDATE Deterministické pouze v případě, že se používá s CONVERT funkcí, CONVERT je zadán parametr stylu a styl se nerovná 0, 100, 9 nebo 109.
RAND RAND je deterministický pouze v případech, kdy je zadán počáteční parametr.

Všechny statistické funkce konfigurace, kurzoru, metadat, zabezpečení a systému jsou nedeterministické. Zobrazí se seznam těchto funkcí.

Následující předdefinované funkce z jiných kategorií jsou vždy nedeterministické.

  • @@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

Volání rozšířených uložených procedur z funkcí

Funkce, které volají rozšířené uložené procedury, jsou nedeterministické, protože rozšířené uložené procedury můžou způsobit vedlejší účinky databáze. Vedlejší účinky jsou změny globálního stavu databáze, například aktualizace tabulky nebo externího prostředku, například souboru nebo sítě. Mezi příklady patří úprava souboru nebo odeslání e-mailové zprávy. Při provádění rozšířené uložené procedury z uživatelem definované funkce nespoléhejte na vrácení konzistentní sady výsledků. Uživatelem definované funkce, které vytvářejí vedlejší účinky databáze, se nedoporučují.

Při volání z funkce nemůže rozšířená uložená procedura klientovi vracet sady výsledků. Jakékoli rozhraní API služby Open Data Services, které vrací sady výsledků klientovi, má návratový FAILkód .

Rozšířená uložená procedura se může připojit zpět k SQL Serveru. Procedura však nemůže spojit stejnou transakci jako původní funkce, která vyvolala rozšířenou uloženou proceduru.

Podobně jako vyvolání z dávky nebo uložené procedury se rozšířená uložená procedura spustí v kontextu účtu zabezpečení systému Windows, ve kterém běží SQL Server. Vlastník rozšířené uložené procedury by měl zvážit oprávnění tohoto kontextu zabezpečení při udělování oprávnění jiným uživatelům ke spuštění procedury.