Udostępnij za pomocą


Funkcje deterministyczne i niedeterministyczne

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstancePunkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Funkcje deterministyczne zawsze zwracają ten sam wynik za każdym razem, gdy są wywoływane z określonym zestawem wartości wejściowych i mają taki sam stan bazy danych. Funkcje nieokreślone mogą zwracać różne wyniki za każdym razem, gdy są wywoływane z określonym zestawem wartości wejściowych, nawet jeśli stan bazy danych, do którego uzyskuje dostęp, pozostaje taki sam. Na przykład funkcja AVG zawsze zwraca ten sam wynik, biorąc pod uwagę podane wcześniej kwalifikacje, ale GETDATE funkcja, która zwraca bieżącą wartość daty/godziny, zawsze zwraca inny wynik.

Istnieje kilka właściwości funkcji zdefiniowanych przez użytkownika, które określają możliwość indeksowania wyników funkcji przez aparat bazy danych programu SQL Server za pośrednictwem indeksów kolumn obliczeniowych wywołujących funkcję lub za pośrednictwem indeksowanych widoków odwołujących się do funkcji. Determinizm funkcji jest jedną z takich właściwości. Na przykład nie można utworzyć indeksu klastrowanego w widoku, jeśli widok odwołuje się do żadnych niedeterministycznych funkcji. Aby uzyskać więcej informacji na temat właściwości funkcji, w tym determinizmu, zobacz Funkcje zdefiniowane przez użytkownika.

Funkcje deterministyczne muszą być powiązane ze schematem. Użyj klauzuli SCHEMABINDING podczas tworzenia funkcji deterministycznej.

W tym artykule opisano determinizm wbudowanych funkcji systemowych oraz wpływ na deterministyczną właściwość funkcji zdefiniowanych przez użytkownika, gdy zawiera wywołanie rozszerzonych procedur składowanych.

Określanie, czy funkcja jest deterministyczna

Możesz sprawdzić, czy funkcja jest deterministyczna, wykonując zapytanie o is_deterministic właściwość obiektu dla funkcji. Poniższy przykład określa, czy funkcja Sales.CalculateSalesTax jest deterministyczna.

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

Wbudowany determinizm funkcji

Nie można wpływać na determinizm żadnej wbudowanej funkcji. Każda wbudowana funkcja jest deterministyczna lub nieokreślona na podstawie sposobu implementacji funkcji przez program SQL Server. Na przykład określenie ORDER BY klauzuli w zapytaniu nie powoduje zmiany determinizmu funkcji używanej w tym zapytaniu.

Wszystkie wbudowane funkcje ciągu są deterministyczne, z wyjątkiem formatu. Aby uzyskać listę tych funkcji, zobacz Funkcje ciągów.

Następujące wbudowane funkcje z kategorii wbudowanych funkcji innych niż funkcje ciągów są zawsze deterministyczne.

  • 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

Poniższe funkcje nie zawsze są deterministyczne, ale mogą być używane w indeksowanych widokach lub indeksach w kolumnach obliczanych, gdy są określone w sposób deterministyczny.

Funkcja Comments
Wszystkie funkcje agregujące Wszystkie funkcje agregujące są deterministyczne, chyba że są określone za pomocą OVER klauzul i ORDER BY . Aby uzyskać listę tych funkcji, zobacz Agregowanie funkcji.
CAST Deterministyczny, chyba że jest używany z data/godzina, smalldatetime lub sql_variant.
CONVERT Deterministyczne, chyba że istnieje jeden z tych warunków:

Typ źródła to sql_variant.

Typ docelowy jest sql_variant , a jego typ źródłowy nie jest nieokreślony.

Typ źródłowy lub docelowy to data/godzina lub mała godzina, inny typ źródłowy lub docelowy jest ciągiem znaków, a określony jest styl nieokreślony. Aby być deterministycznym, parametr stylu musi być stałą. Ponadto style mniejsze niż lub równe 100 są nieokreślone, z wyjątkiem stylów 20 i 21. Style większe niż 100 są deterministyczne, z wyjątkiem stylów 106, 107, 109 i 113.
CHECKSUM Deterministyczne, z wyjątkiem CHECKSUM(*).
ISDATE Deterministyczne tylko w przypadku użycia z funkcją CONVERT parametr CONVERT stylu jest określony, a styl nie jest równy 0, 100, 9 lub 109.
RAND RAND jest deterministyczny tylko wtedy, gdy określono parametr inicjatora .

Wszystkie funkcje statystyczne konfiguracji, kursora, metadanych, zabezpieczeń i systemu są nieokreślone. Zostanie wyświetlona lista tych funkcji.

Następujące wbudowane funkcje z innych kategorii są zawsze nieokreślone.

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

Wywoływanie rozszerzonych procedur składowanych z funkcji

Funkcje, które wywołują rozszerzone procedury składowane, są nieokreślone, ponieważ rozszerzone procedury składowane mogą powodować skutki uboczne bazy danych. Skutki uboczne to zmiany w globalnym stanie bazy danych, takie jak aktualizacja tabeli lub zasób zewnętrzny, taki jak plik lub sieć. Przykłady obejmują modyfikowanie pliku lub wysyłanie wiadomości e-mail. Nie polegaj na zwracaniu spójnego zestawu wyników podczas wykonywania rozszerzonej procedury składowanej z funkcji zdefiniowanej przez użytkownika. Funkcje zdefiniowane przez użytkownika, które tworzą skutki uboczne dla bazy danych, nie są zalecane.

Po wywołaniu z wewnątrz funkcji rozszerzona procedura składowana nie może zwrócić zestawów wyników do klienta. Każdy interfejs API usługi Open Data Services, który zwraca zestawy wyników do klienta, ma kod FAILzwrotny .

Rozszerzona procedura składowana może łączyć się z powrotem z programem SQL Server. Jednak procedura nie może połączyć tej samej transakcji co oryginalna funkcja, która wywołała rozszerzoną procedurę składowaną.

Podobnie jak wywołania z partii lub procedury składowanej, rozszerzona procedura składowana jest wykonywana w kontekście konta zabezpieczeń systemu Windows, w ramach którego jest uruchomiony program SQL Server. Właściciel rozszerzonej procedury składowanej powinien rozważyć uprawnienia tego kontekstu zabezpieczeń podczas udzielania uprawnień innym użytkownikom do wykonania procedury.