Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric Preview
Deterministische functies retourneren altijd hetzelfde resultaat wanneer ze worden aangeroepen met een specifieke set invoerwaarden en met dezelfde status van de database. Niet-deterministische functies kunnen verschillende resultaten retourneren telkens wanneer ze worden aangeroepen met een specifieke set invoerwaarden, zelfs als de databasestatus waartoe ze toegang hebben hetzelfde blijft. De functie AVG retourneert bijvoorbeeld altijd hetzelfde resultaat op basis van de eerder genoemde kwalificaties, maar de GETDATE functie, die de huidige datum/tijd-waarde retourneert, retourneert altijd een ander resultaat.
Er zijn verschillende eigenschappen van door de gebruiker gedefinieerde functies die bepalen of de SQL Server Database Engine de resultaten van de functie kan indexeren, hetzij via indexen op berekende kolommen die de functie aanroepen, of via geïndexeerde weergaven die verwijzen naar de functie. Het determinisme van een functie is een dergelijke eigenschap. Een geclusterde index kan bijvoorbeeld niet worden gemaakt in een weergave als de weergave verwijst naar niet-deterministische functies. Zie Door de gebruiker gedefinieerde functies voor meer informatie over de eigenschappen van functies, waaronder determinisme.
Deterministische functies moeten schemagebonden zijn. Gebruik de component bij het SCHEMABINDING maken van een deterministische functie.
Dit artikel identificeert het determinisme van ingebouwde systeemfuncties en het effect op de deterministische eigenschap van door de gebruiker gedefinieerde functies wanneer het een aanroep naar uitgebreide opgeslagen procedures bevat.
Bepalen of een functie deterministisch is
U kunt controleren of een functie deterministisch is door een query uit te voeren op de is_deterministic objecteigenschap voor de functie. In het volgende voorbeeld wordt bepaald of de functie Sales.CalculateSalesTax deterministisch is.
SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');
Ingebouwde functiedeterminisme
U kunt het determinisme van een ingebouwde functie niet beïnvloeden. Elke ingebouwde functie is deterministisch of niet-deterministisch, op basis van hoe de functie wordt geïmplementeerd door SQL Server. Als u bijvoorbeeld een ORDER BY component in een query opgeeft, wordt het determinisme van een functie die in die query wordt gebruikt, niet gewijzigd.
Alle ingebouwde tekenreeksfuncties zijn deterministisch, met uitzondering van FORMAT. Zie Tekenreeksfuncties voor een lijst met deze functies.
De volgende ingebouwde functies uit categorieën ingebouwde functies, behalve tekenreeksfuncties, zijn altijd deterministisch.
ABSACOSASINATANATN2CEILINGCOALESCECOSCOTDATALENGTHDATEADDDATEDIFFDAYDEGREESEXPFLOORISNULLISNUMERICLOGLOG10MONTHNULLIFPOWERRADIANSROUNDSIGNSINSQRTSQUARETANYEAR
De volgende functies zijn niet altijd deterministisch, maar kunnen worden gebruikt in geïndexeerde weergaven of indexen voor berekende kolommen wanneer ze op een deterministische manier worden opgegeven.
| Functie | Comments |
|---|---|
| Alle statistische functies | Alle statistische functies zijn deterministisch, tenzij ze worden opgegeven met de OVER en ORDER BY componenten. Zie Statistische functies voor een lijst met deze functies. |
CAST |
Deterministisch, tenzij gebruikt met datum/tijd, smalldatetime of sql_variant. |
CONVERT |
Deterministisch tenzij een van deze voorwaarden bestaat: Het brontype is sql_variant. Het doeltype is sql_variant en het brontype is niet-deterministisch. Bron- of doeltype is datum/tijd of smalldatetime, het andere bron- of doeltype is een tekenreeks en er wordt een niet-deterministische stijl opgegeven. Als u deterministisch wilt zijn, moet de stijlparameter een constante zijn. Daarnaast zijn stijlen kleiner dan of gelijk aan 100 niet-deterministisch, met uitzondering van stijlen 20 en 21. Stijlen groter dan 100 zijn deterministisch, met uitzondering van stijlen 106, 107, 109 en 113. |
CHECKSUM |
Deterministisch, met uitzondering van CHECKSUM(*). |
ISDATE |
Deterministisch alleen als deze wordt gebruikt met de CONVERT functie, wordt de CONVERT stijlparameter opgegeven en is de stijl niet gelijk aan 0, 100, 9 of 109. |
RAND |
RAND is alleen deterministisch wanneer een seed-parameter is opgegeven. |
Alle configuratie-, cursor-, metagegevens-, beveiligings- en systeemstatistiekenfuncties zijn niet-deterministisch. U kunt een lijst met deze functies bekijken.
De volgende ingebouwde functies uit andere categorieën zijn altijd niet-deterministisch.
@@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
Uitgebreide opgeslagen procedures aanroepen vanuit functies
Functies die uitgebreide opgeslagen procedures aanroepen, zijn niet-deterministisch, omdat de uitgebreide opgeslagen procedures neveneffecten op de database kunnen veroorzaken. Neveneffecten zijn wijzigingen in een globale status van de database, zoals een update van een tabel of een externe resource, zoals een bestand of het netwerk. Voorbeelden hiervan zijn het wijzigen van een bestand of het verzenden van een e-mailbericht. Vertrouw niet op het retourneren van een consistente resultatenset bij het uitvoeren van een uitgebreide opgeslagen procedure van een door de gebruiker gedefinieerde functie. Door de gebruiker gedefinieerde functies die bijwerkingen op de database maken, worden niet aanbevolen.
Wanneer de functie wordt aangeroepen vanuit een functie, kan de uitgebreide opgeslagen procedure geen resultatensets retourneren aan de client. Elke Open Data Services-API die resultatensets naar de client retourneert, heeft een retourcode van FAIL.
De uitgebreide opgeslagen procedure kan verbinding maken met SQL Server. De procedure kan echter niet deelnemen aan dezelfde transactie als de oorspronkelijke functie die de uitgebreide opgeslagen procedure heeft aangeroepen.
Net als bij aanroepen van een batch of opgeslagen procedure wordt de uitgebreide opgeslagen procedure uitgevoerd in de context van het Windows-beveiligingsaccount waaronder SQL Server wordt uitgevoerd. De eigenaar van de uitgebreide opgeslagen procedure moet rekening houden met de machtigingen van deze beveiligingscontext bij het verlenen van machtigingen aan andere gebruikers om de procedure uit te voeren.