函数(数据库引擎)
SQL Server 提供了可用于执行特定操作的内置函数。
函数可用于或包括在:
使用 SELECT 语句的查询的选择列表中,以返回一个值。
SELECT DB_NAME(); GO
SELECT 或数据修改(SELECT、INSERT、DELETE 或 UPDATE)语句的 WHERE 子句搜索条件中,以限制符合查询条件的行。
USE AdventureWorks2008R2; GO SELECT SalesOrderID, ProductID, OrderQty FROM Sales.SalesOrderDetail WHERE OrderQty = (SELECT MAX(OrderQty) FROM Sales.SalesOrderDetail); GO
视图的搜索条件(WHERE 子句)中,以使视图在运行时与用户或环境动态地保持一致。
CREATE VIEW ShowMyEmploymentInfo AS SELECT FirstName, LastName FROM Person.Person WHERE BusinessEntityID = SUSER_SID(); GO
任意表达式中。
CHECK 约束或触发器中,以在插入数据时查找指定的值。
CREATE TABLE SalesContacts (SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL); GO
DEFAULT 约束或触发器中,以在 INSERT 语句未指定值的情况下提供一个值。
CREATE TABLE SalesContacts ( SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL, WhenCreated DATETIME DEFAULT GETDATE(), Creator INT DEFAULT SUSER_SID() ); GO
指定函数时应始终带上括号,即使没有参数也是如此。但是,与 DEFAULT 关键字一起使用的 niladic 函数例外。niladic 函数不带参数。有关 DEFAULT 关键字的详细信息,请参阅 ALTER TABLE (Transact-SQL) 和 CREATE TABLE (Transact-SQL)。
有时,用来指定数据库、计算机、登录名或数据库用户的参数是可选的。如果未指定这些参数,则默认将这些参数赋值为当前的数据库、主机、登录名或数据库用户。
函数可以嵌套。
函数类别
下表列出了 SQL Server 函数的类别。
函数类别 |
说明 |
---|---|
执行的操作是将多个值合并为一个值。例如 COUNT、SUM、MIN 和 MAX。 |
|
是一种标量函数,可返回有关配置设置的信息。 |
|
支持加密、解密、数字签名和数字签名验证。 |
|
返回有关游标状态的信息。 |
|
可以更改日期和时间的值。 |
|
执行三角、几何和其他数字运算。 |
|
返回数据库和数据库对象的属性信息。 |
|
是一种非确定性函数,可以返回分区中每一行的排名值。 |
|
返回可在 Transact-SQL 语句中表引用所在位置使用的行集。 |
|
返回有关用户和角色的信息。 |
|
可更改 char、varchar、nchar、nvarchar、binary 和 varbinary 的值。 |
|
对系统级的各种选项和对象进行操作或报告。 |
|
返回有关 SQL Server 性能的信息。 |
|
可更改 text 和 image 的值。 |
确定性函数和不确定性函数
在 SQL Server 中,函数可分为严格确定、确定和非确定三类。
如果对于一组特定的输入值,函数始终返回相同的结果,则该函数就是严格确定的。
对于用户定义的函数,判断其是否确定的标准相对宽松。如果对于一组特定的输入值和数据库状态,函数始终返回相同的结果,则该用户定义的函数就是确定的。如果函数是数据访问函数,即使它不是严格确定的,也可以从这个角度认为它是确定的。
使用同一组输入值重复调用非确定性函数,返回的结果可能会不同。例如,函数 GETDATE() 是非确定的。SQL Server 对各种类型的非确定性函数进行了限制。因此,应慎用非确定性函数。
对于内置函数,确定性和严格确定性是相同的。对于 Transact-SQL 用户定义的函数,系统将验证定义并防止定义非确定性函数。但是,数据访问或未绑定到架构的函数被视为非严格确定性函数。对于公共语言运行时 (CLR) 函数,函数定义将指定该函数的确定性、数据访问和系统数据访问等属性,但是由于这些属性未经系统验证,因而函数将始终被视为非严格确定性函数。
如果函数缺少确定性,其使用范围将受到限制。只有确定性函数才可以在索引视图、索引计算列、持久化计算列或 Transact-SQL 用户定义函数的定义中调用。
如果函数缺少严格确定性,会阻碍有益的性能优化。特定的计划重新排序步骤将被跳过,以适当地保留正确性。此外,用户定义函数的数量、顺序和调用时间随具体的实施而定。请勿依赖这些调用语意。内置 RAND 和 GETDATE 系列非确定性函数在运行时是确定的,除此之外,其数量、顺序和调用时间均取决于所选择的计划。
最佳方法建议
我们建议您尽可能在任何时候都遵循以下方针:
1. 如果有可能,尽量编写严格确定性函数。尤其是要使 Transact-SQL 函数成为绑定到架构的函数。
2. 将非确定性函数作为最后的选择。
3. 请勿在关键性能查询中使用非确定性函数。
4. 请勿依赖数量、顺序或调用时间,因为这些可能是随具体的实施而定的。
有关详细信息,请参阅确定性函数和不确定性函数。