Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL Analytics-végpont a Microsoft Fabricben
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
A determinisztikus függvények mindig ugyanazt az eredményt adják vissza minden alkalommal, amikor egy adott bemeneti értékkészlettel hívják meg őket, és ugyanazt az állapotot adják vissza az adatbázisnak. A nemdeterminista függvények minden alkalommal eltérő eredményeket adnak vissza, amikor egy adott bemeneti értékekkel hívják meg őket, még akkor is, ha az adatbázis állapota, amelyhez hozzáférnek, változatlan marad. A függvény AVG például mindig ugyanazt az eredményt adja vissza a korábban megadott minősítések alapján, de a GETDATE függvény, amely az aktuális datetime értéket adja vissza, mindig egy másik eredményt ad vissza.
A felhasználó által definiált függvények számos tulajdonsága határozza meg, hogy az SQL Server adatbázismotor képes-e indexelni a függvény eredményeit, akár a függvényt meghívó számított oszlopok indexén keresztül, akár a függvényre hivatkozó indexelt nézeteken keresztül. A függvény determinizmusa egy ilyen tulajdonság. Nem hozható létre például fürtözött index egy nézetben, ha a nézet nemdeterminista függvényekre hivatkozik. További információ a függvények tulajdonságairól, beleértve a determinizmust is, lásd a felhasználó által definiált függvényeket.
A determinisztikus függvények sémához kötöttnek kell lenniük. Determinisztikus függvény létrehozásakor használja a SCHEMABINDING záradékot.
Ez a cikk a beépített rendszerfüggvények determinizmusát és a felhasználó által definiált függvények determinisztikus tulajdonságára gyakorolt hatást azonosítja, amikor kiterjesztett tárolt eljárások meghívását tartalmazza.
Annak meghatározása, hogy egy függvény determinisztikus-e
A függvény objektumtulajdonságának lekérdezésével is_deterministic ellenőrizheti, hogy egy függvény determinisztikus-e. Az alábbi példa meghatározza, hogy a függvény Sales.CalculateSalesTax determinisztikus-e.
SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');
Beépített függvény determinizmusa
A beépített függvények determinizmusát nem lehet befolyásolni. Minden beépített függvény determinisztikus vagy nemdeterminista, attól függően, hogy az SQL Server hogyan valósítja meg a függvényt. Ha például egy záradékot ad meg egy ORDER BY lekérdezésben, az nem változtatja meg az adott lekérdezésben használt függvény determinizmusát.
A beépített sztringfüggvények mindegyike determinisztikus, a FORMAT kivételével. Ezeknek a függvényeknek a listáját a Karakterláncfüggvények című témakörben találja.
A következő beépített függvények a sztringfüggvényektől eltérő beépített függvények kategóriáiból mindig determinisztikusak.
ABSACOSASINATANATN2CEILINGCOALESCECOSCOTDATALENGTHDATEADDDATEDIFFDAYDEGREESEXPFLOORISNULLISNUMERICLOGLOG10MONTHNULLIFPOWERRADIANSROUNDSIGNSINSQRTSQUARETANYEAR
A következő függvények nem mindig determinisztikusak, de a determinisztikus módon megadott számított oszlopok indexelt nézeteiben vagy indexeiben is használhatók.
| Funkció | Comments |
|---|---|
| Minden összesítő függvény | Az összesítő függvények determinisztikusak, hacsak nincsenek megadva a záradékokkal és OVER a ORDER BY záradékokkal. A függvények listáját az Összesítő függvények című témakörben találja. |
CAST |
Determinisztikus, kivéve, ha datetime, smalldatetime vagy sql_variant. |
CONVERT |
Determinisztikus, kivéve, ha az alábbi feltételek egyike létezik: A forrás típusa sql_variant. A céltípus sql_variant , forrástípusa pedig nem meghatározható. A forrás- vagy céltípus datetime vagy smalldatetime, a másik forrás- vagy céltípus egy karaktersztring, és egy nemdeterminista stílus van megadva. Ahhoz, hogy determinisztikus legyen, a stílusparaméternek állandónak kell lennie. Emellett a 100-nál kisebb vagy egyenlő stílusok nem határozhatók meg, kivéve a 20- és a 21-es stílusokat. A 100-nál nagyobb stílusok determinisztikusak, kivéve a 106,107, 109 és 113 stílusokat. |
CHECKSUM |
Determinisztikus, kivéve .CHECKSUM(*) |
ISDATE |
Csak akkor determinisztikus, ha a CONVERT függvényt használja, a CONVERT stílusparaméter meg van adva, és a stílus nem egyenlő 0, 100, 9 vagy 109 értékekkel. |
RAND |
RAND csak a magparaméter megadásakor determinisztikus. |
Az összes konfigurációs, kurzor-, metaadat-, biztonsági és rendszerstatisztikai függvény nem meghatározható. A függvények listája látható.
Az alábbi beépített függvények más kategóriákból mindig nemdeterminisztikusak.
@@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
Kiterjesztett tárolt eljárások meghívása függvényekből
A kiterjesztett tárolt eljárásokat hívó függvények nem határozhatók meg, mivel a kiterjesztett tárolt eljárások mellékhatásokat okozhatnak az adatbázisban. A mellékhatások az adatbázis globális állapotának változásai, például egy tábla vagy egy külső erőforrás, például egy fájl vagy a hálózat frissítése. Ilyen például egy fájl módosítása vagy e-mail küldése. Ne támaszkodjon arra, hogy konzisztens eredményhalmazt adjon vissza, amikor kiterjesztett tárolt eljárást hajt végre egy felhasználó által definiált függvényből. Az adatbázisra mellékhatásokat létrehozó, felhasználó által definiált függvények használata nem ajánlott.
Ha függvényen belülről hívjuk meg, a kiterjesztett tárolt eljárás nem tud eredményhalmazokat visszaadni az ügyfélnek. Minden Olyan Open Data Services API, amely eredményhalmazokat ad vissza az ügyfélnek, a visszatérési kód a FAILkövetkező: .
A kiterjesztett tárolt eljárás vissza tud kapcsolódni az SQL Serverhez. Az eljárás azonban nem tud ugyanahhoz a tranzakcióhoz csatlakozni, mint a kiterjesztett tárolt eljárást meghívó eredeti függvény.
A kötegből vagy tárolt eljárásból származó meghívásokhoz hasonlóan a kiterjesztett tárolt eljárás annak a Windows biztonsági fióknak a kontextusában lesz végrehajtva, amelyen az SQL Server fut. A kiterjesztett tárolt eljárás tulajdonosának figyelembe kell vennie ennek a biztonsági környezetnek az engedélyeit, amikor engedélyeket ad más felhasználóknak az eljárás végrehajtásához.