SQL Server 中的确定性和非确定性函数
1. 确定性函数:
每次使用一组固定的输入值调用确定性函数并给定相同的数据库条件时,确定性函数总是会产生相同的输出。例如,AVG()函数在给定上述条件的情况下总是产生相同的结果。
2. 非确定性函数:
每次使用一组固定的输入值调用非确定性函数时,它们都会产生不同的输出,即使它们访问的数据库状态保持不变。例如, GETDATE()函数,结果是当前日期和时间值,总是不同的值。
内置函数确定性:
您不能影响任何内置函数的确定性。内置函数可能是确定性的,也可能是非确定性的,具体取决于函数的属性,由 SQL Server 实现。例如,在任何查询中使用 ORDER BY 子句都不会更改查询中使用的函数的确定性。
确定性内置函数是:
ABS | DATEDIFF |
---|---|
POWER | ACOS |
DAY | RADIANS |
ASIN | DEGREES |
ROUND | ATAN |
EXP | SIGN |
ATN2 | FLOOR |
FLOOR | SIN |
CEILING | ISNULL |
SQUARE | COALESCE |
ISNUMERIC | SQRT |
DATEADD | NULLIF |
COS | LOG10 |
LOG | YEAR |
TAN | DATALENGTH |
COT | MONTH |
以下函数并不总是确定性的,但在以确定性方式指定时可能是确定性的:
- CAST 是确定性的,直到与 DateTime、smalldatetime 或 sql_variant 一起使用。
- ISDATE 仅在与 CONVERT函数一起使用的情况下才是确定性的。
- CONVERT 是确定性的,直到存在这些条件之一。
- 源类型可能是 sql_variant。
- 目标类型可能是 sql_variant 并且其源类型是不确定的。
非确定性内置函数是:
@@CONNECTIONS | LAG |
---|---|
@@DBTS | LAST_VALUE |
@@IDLE | LEAD |
@@CPU_BUSY | MIN_ACTIVE_ROWVERSION |
@@IO_BUSY | NEWID |
@@PACK_RECEIVED | NEWSEQUENTIALID |
@@MAX_CONNECTIONS | NEXT VALUE FOR |
@@PACK_SENT | NTILE |
@@PACKET_ERRORS | PARSENAME |
@@TIMETICKS | PERCENTILE_CONT |
@@TOTAL_ERRORS | PERCENTILE_DISC |
@@TOTAL_READ | CUME_DIST |
@@TOTAL_WRITE | PERCENT_RANK |
GETUTCDATE | FORMAT |
GETDATE | RAND |
GET_TRANSMISSION_STATUS | DENSE_RANK |
CURRENT_TIMESTAMP | FIRST_VALUE |
RANK | ROW_NUMBER |