Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Magazyn w usłudze Microsoft Fabric
Baza 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.
ABSACOSASINATANATN2CEILINGCOALESCECOSCOTDATALENGTHDATEADDDATEDIFFDAYDEGREESEXPFLOORISNULLISNUMERICLOGLOG10MONTHNULLIFPOWERRADIANSROUNDSIGNSINSQRTSQUARETANYEAR
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_WRITEAT TIME ZONECUME_DISTCURRENT_TIMESTAMPDENSE_RANKFIRST_VALUEFORMATGETDATEGETUTCDATEGET_TRANSMISSION_STATUSLAGLAST_VALUELEADMIN_ACTIVE_ROWVERSIONNEWIDNEWSEQUENTIALIDNEXT VALUE FORNTILEPARSENAMEPERCENTILE_CONTPERCENTILE_DISCPERCENT_RANKRANDRANKROW_NUMBERTEXTPTR
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.