Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLKoncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databá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é.
ABSACOSASINATANATN2CEILINGCOALESCECOSCOTDATALENGTHDATEADDDATEDIFFDAYDEGREESEXPFLOORISNULLISNUMERICLOGLOG10MONTHNULLIFPOWERRADIANSROUNDSIGNSINSQRTSQUARETANYEAR
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_WRITEAT TIME ZONECUME_DISTCURRENT_TIMESTAMPDENSE_RANKFIRST_VALUEFORMATGETDATEGETUTCDATEGET_TRANSMISSION_STATUSLAGLAST_VALUELEADMIN_ACTIVE_ROWVERSIONNEWIDNEWSEQUENTIALIDNEXT VALUE FORNTILEPARSENAMEPERCENTILE_CONTPERCENTILE_DISCPERCENT_RANKRANDRANKROW_NUMBERTEXTPTR
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.