函数(数据库引擎)

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 函数的类别。

函数类别

说明

聚合函数 (Transact-SQL)

执行的操作是将多个值合并为一个值。例如 COUNT、SUM、MIN 和 MAX。

配置函数

是一种标量函数,可返回有关配置设置的信息。

加密函数 (Transact-SQL)

支持加密、解密、数字签名和数字签名验证。

游标函数

返回有关游标状态的信息。

日期和时间函数

可以更改日期和时间的值。

数学函数

执行三角、几何和其他数字运算。

元数据函数

返回数据库和数据库对象的属性信息。

排名函数

是一种非确定性函数,可以返回分区中每一行的排名值。

行集函数 (Transact-SQL)

返回可在 Transact-SQL 语句中表引用所在位置使用的行集。

安全函数

返回有关用户和角色的信息。

字符串函数

可更改 char、varchar、nchar、nvarchar、binary 和 varbinary 的值。

系统函数

对系统级的各种选项和对象进行操作或报告。

系统统计函数 (Transact-SQL)

返回有关 SQL Server 性能的信息。

文本和图像函数

可更改 text 和 image 的值。

确定性函数和不确定性函数

在 SQL Server 中,函数可分为严格确定、确定和非确定三类。

如果对于一组特定的输入值,函数始终返回相同的结果,则该函数就是严格确定的。

对于用户定义的函数,判断其是否确定的标准相对宽松。如果对于一组特定的输入值和数据库状态,函数始终返回相同的结果,则该用户定义的函数就是确定的。如果函数是数据访问函数,即使它不是严格确定的,也可以从这个角度认为它是确定的。

使用同一组输入值重复调用非确定性函数,返回的结果可能会不同。例如,函数 GETDATE() 是非确定的。SQL Server 对各种类型的非确定性函数进行了限制。因此,应慎用非确定性函数。

对于内置函数,确定性和严格确定性是相同的。对于 Transact-SQL 用户定义的函数,系统将验证定义并防止定义非确定性函数。但是,数据访问或未绑定到架构的函数被视为非严格确定性函数。对于公共语言运行时 (CLR) 函数,函数定义将指定该函数的确定性、数据访问和系统数据访问等属性,但是由于这些属性未经系统验证,因而函数将始终被视为非严格确定性函数。

如果函数缺少确定性,其使用范围将受到限制。只有确定性函数才可以在索引视图、索引计算列、持久化计算列或 Transact-SQL 用户定义函数的定义中调用。

如果函数缺少严格确定性,会阻碍有益的性能优化。特定的计划重新排序步骤将被跳过,以适当地保留正确性。此外,用户定义函数的数量、顺序和调用时间随具体的实施而定。请勿依赖这些调用语意。内置 RAND 和 GETDATE 系列非确定性函数在运行时是确定的,除此之外,其数量、顺序和调用时间均取决于所选择的计划。

最佳方法建议

我们建议您尽可能在任何时候都遵循以下方针:

1. 如果有可能,尽量编写严格确定性函数。尤其是要使 Transact-SQL 函数成为绑定到架构的函数。

2. 将非确定性函数作为最后的选择。

3. 请勿在关键性能查询中使用非确定性函数。

4. 请勿依赖数量、顺序或调用时间,因为这些可能是随具体的实施而定的。

有关详细信息,请参阅确定性函数和不确定性函数