Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Förhandsversion av Microsoft Fabric
Deterministiska funktioner returnerar alltid samma resultat varje gång de anropas med en specifik uppsättning indatavärden och får samma tillstånd för databasen. Nondeterministiska funktioner kan returnera olika resultat varje gång de anropas med en specifik uppsättning indatavärden även om databastillståndet som de har åtkomst till förblir detsamma. Funktionen AVG returnerar till exempel alltid samma resultat med tanke på de kvalifikationer som angavs tidigare, men GETDATE funktionen, som returnerar det aktuella datetime-värdet, returnerar alltid ett annat resultat.
Det finns flera egenskaper för användardefinierade funktioner som avgör möjligheten för SQL Server Database Engine att indexeras resultatet av funktionen, antingen via index på beräknade kolumner som anropar funktionen eller genom indexerade vyer som refererar till funktionen. Determinismen hos en funktion är en sådan egenskap. Ett grupperat index kan till exempel inte skapas i en vy om vyn refererar till några icke-förutbestämda funktioner. Mer information om funktionernas egenskaper, inklusive determinism, finns i Användardefinierade funktioner.
Deterministiska funktioner måste vara schemabundna.
SCHEMABINDING Använd -satsen när du skapar en deterministisk funktion.
Den här artikeln identifierar determinism för inbyggda systemfunktioner och effekten på den deterministiska egenskapen för användardefinierade funktioner när den innehåller ett anrop till utökade lagrade procedurer.
Avgöra om en funktion är deterministisk
Du kan kontrollera om en funktion är deterministisk genom att is_deterministic fråga objektegenskapen för funktionen. I följande exempel avgörs om funktionen Sales.CalculateSalesTax är deterministisk.
SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');
Inbyggd funktionsdeterminism
Du kan inte påverka determinismen i någon inbyggd funktion. Varje inbyggd funktion är deterministisk eller icke-deterministisk, baserat på hur funktionen implementeras av SQL Server. Om du till exempel anger en ORDER BY sats i en fråga ändras inte determinismen för en funktion som används i frågan.
Alla inbyggda strängfunktioner är deterministiska, förutom FORMAT. En lista över dessa funktioner finns i Strängfunktioner.
Följande inbyggda funktioner från kategorier av andra inbyggda funktioner än strängfunktioner är alltid deterministiska.
ABSACOSASINATANATN2CEILINGCOALESCECOSCOTDATALENGTHDATEADDDATEDIFFDAYDEGREESEXPFLOORISNULLISNUMERICLOGLOG10MONTHNULLIFPOWERRADIANSROUNDSIGNSINSQRTSQUARETANYEAR
Följande funktioner är inte alltid deterministiska, men kan användas i indexerade vyer eller index på beräknade kolumner när de anges på ett deterministiskt sätt.
| Funktion | Comments |
|---|---|
| Alla aggregeringsfunktioner | Alla aggregeringsfunktioner är deterministiska om de inte anges med OVER - och-satserna ORDER BY . En lista över dessa funktioner finns i Aggregerade funktioner. |
CAST |
Deterministisk om den inte används med datetime, smalldatetime eller sql_variant. |
CONVERT |
Deterministisk om inget av dessa villkor finns: Källtypen är sql_variant. Måltypen är sql_variant och dess källtyp är nondeterministisk. Käll- eller måltyp är datetime eller smalldatetime, den andra käll- eller måltypen är en teckensträng och ett nondeterministiskt format har angetts. För att vara deterministisk måste formatparametern vara en konstant. Dessutom är format som är mindre än eller lika med 100 icke-terministiska, förutom formaten 20 och 21. Format som är större än 100 är deterministiska, förutom formaten 106, 107, 109 och 113. |
CHECKSUM |
Deterministisk, förutom CHECKSUM(*). |
ISDATE |
Deterministisk endast om den CONVERTCONVERT används med funktionen anges formatparametern och formatmallen är inte lika med 0, 100, 9 eller 109. |
RAND |
RAND är deterministisk endast när en seed-parameter har angetts. |
Alla funktioner för konfiguration, markören, metadata, säkerhet och systemstatistik är icke-terministiska. Du kan se en lista över dessa funktioner.
Följande inbyggda funktioner från andra kategorier är alltid icke-terministiska.
@@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
Anropa utökade lagrade procedurer från funktioner
Funktioner som anropar utökade lagrade procedurer är icke-terministiska, eftersom de utökade lagrade procedurerna kan orsaka biverkningar på databasen. Biverkningar är ändringar i databasens globala tillstånd, till exempel en uppdatering av en tabell eller till en extern resurs, till exempel en fil eller nätverket. Exempel är att ändra en fil eller skicka ett e-postmeddelande. Förlita dig inte på att returnera en konsekvent resultatuppsättning när du kör en utökad lagrad procedur från en användardefinierad funktion. Användardefinierade funktioner som skapar biverkningar på databasen rekommenderas inte.
När den utökade lagrade proceduren anropas inifrån en funktion kan den inte returnera resultatuppsättningar till klienten. Alla Open Data Services-API:er som returnerar resultatuppsättningar till klienten har en returkod på FAIL.
Den utökade lagrade proceduren kan ansluta tillbaka till SQL Server. Proceduren kan dock inte ansluta samma transaktion som den ursprungliga funktionen som anropade den utökade lagrade proceduren.
På samma sätt som anrop från en batch eller lagrad procedur körs den utökade lagrade proceduren i kontexten för Windows-säkerhetskontot där SQL Server körs. Ägaren av den utökade lagrade proceduren bör överväga behörigheterna för den här säkerhetskontexten när de beviljar behörigheter till andra användare att utföra proceduren.