SQL Server 2005------函数

原文:SQL Server 2005------函数

SQL Server 2005支持用户自定义函数和内置系统函数,根据返回值类型又分为标量函数和表值函数。

1.标量函数
标量函数:返回单个数据值,返回类型可以是除 text、ntext、image、cursor 和 timestamp 外的任何数据类型。
标量函数:分为内联标量函数和多语句标量函数。
内联标量函数:没有函数体,标量值是单个语句的结果。
多语句标量函数:定义在 BEGIN...END 块中的函数体包含一系列返回单个值的 Transact-SQL 语句。
多语句标量函数范例:
      CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)
      RETURNS int
      AS
      BEGIN
         DECLARE @ret int;
         SELECT @ret = SUM(p.Quantity)
         FROM Production.ProductInventory p
         WHERE p.ProductID = @ProductID
               AND p.LocationID = '6';
         IF (@ret IS NULL)
            SET @ret = 0;
         RETURN @ret;
      END;

2.标值函数
表值函数:返回 table 数据类型,分为内联表值函数和多语句表值函数。
内联表值函数:没有函数主体。
区别:如果 RETURNS 子句指定的 TABLE 不附带列的列表,则该函数为内嵌表值函数。
      如果 RETURNS 子句指定的 TABLE 类型带有列及其数据类型,则该函数是多语句表值函数。
内联表值函数范例:
      CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
      RETURNS TABLE
      AS
         RETURN
         (
           SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'YTD Total'
           FROM Production.Product AS P
           JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
           JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
           WHERE SH.CustomerID = @storeid
           GROUP BY P.ProductID, P.Name
          );
多语句表值函数:在 BEGIN...END 语句块中定义的函数体包含一系列 Transact-SQL 语句,这些语句可生成行并将其插入将返回的表中。
多语句表值函数范例:
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)
RETURNS @retFindReports TABLE
(
    EmployeeID int primary key NOT NULL,
    Name nvarchar(255) NOT NULL,
    Title nvarchar(50) NOT NULL,
    EmployeeLevel int NOT NULL,
    Sort nvarchar (255) NOT NULL
)
--Returns a result set that lists all the employees who report to the
--specific employee directly or indirectly.*/
AS
BEGIN
   WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort) AS
    (SELECT CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName),
        e.Title,
        e.EmployeeID,
        1,
        CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName)
     FROM HumanResources.Employee AS e
          JOIN Person.Contact AS c ON e.ContactID = c.ContactID
     WHERE e.EmployeeID = @InEmpID
   UNION ALL
     SELECT CONVERT(Varchar(255), REPLICATE ('| ' , EmployeeLevel) +
        c.FirstName + ' ' + c.LastName),
        e.Title,
        e.EmployeeID,
        EmployeeLevel + 1,
        CONVERT (Varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' +
                 LastName)
     FROM HumanResources.Employee as e
          JOIN Person.Contact AS c ON e.ContactID = c.ContactID
          JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
    )
-- copy the required columns to the result of the function
   INSERT @retFindReports
   SELECT EmployeeID, Name, Title, EmployeeLevel, Sort
   FROM DirectReports
   RETURN
END;
GO
-- Example invocation
SELECT EmployeeID, Name, Title, EmployeeLevel
FROM dbo.ufn_FindReports(109)
ORDER BY Sort;

多语句表值函数中只允许使用下面的语句类型:
     赋值语句。
     控制流语句。
     DECLARE 语句,该语句定义函数局部的数据变量和游标。
     SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
     游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句;不允许使用将数据返回到客户端的 FETCH 语句。
     INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。
     EXECUTE 语句调用扩展存储过程。

3.内置函数
   SQL Server 提供了内置函数帮助您执行各种操作。这些函数不能修改。可以在 Transact-SQL 语句中使用内置函数,完成以下操作:
      从 SQL Server 系统表中访问信息而不直接访问系统表。有关详细信息,请参阅使用系统函数。
      执行常见任务,例如 SUM、GETDATE 或 IDENTITY。有关详细信息,请参阅Functions (Transact-SQL)。
   内置函数返回标量数据类型或 table 数据类型。例如,如果成功执行了最后一条 Transact-SQL 语句,@@ERROR 将返回 0。如果该语句生成错误,则 @@ERROR 将返回错误号。而函数 SUM(parameter) 将返回参数的所有值的和。     

4.函数与存储过程的区别
    函数不能用于执行一系列改变物理数据库状态的操作。BEGIN...END 块中的语句不能有任何副作用。函数副作用是指对具有函数外作用域(例如数据库表的修改)的资源状态的任何永久性更改。函数中的语句唯一能做的更改是对函数上的局部对象(如局部游标或局部变量)的更改。不能在函数中执行的操作包括:对数据库表的修改,对不在函数上的局部游标进行操作,发送电子邮件,尝试修改目录,以及生成返回至用户的结果集。

5.用户定义函数中不允许使用会对每个调用返回不同数据的内置函数,用户定义函数中不允许使用以下内置函数:
         @@CONNECTIONS @@PACK_SENT GETDATE
         @@CPU_BUSY @@PACKET_ERRORS GetUTCDate
         @@IDLE @@TIMETICKS NEWID
         @@IO_BUSY @@TOTAL_ERRORS RAND
         @@MAX_CONNECTIONS @@TOTAL_READ TEXTPTR
         @@PACK_RECEIVED @@TOTAL_WRITE

时间: 2024-09-30 00:38:10

SQL Server 2005------函数的相关文章

在 SQL Server 2005 中使用表值函数来实现空间数据库

server|函数|数据|数据库 Gyorgy Fekete 和 Alex Szalay约翰霍普金丝大学 Jim GrayMicrosoft(联系作者) 适用于Microsoft SQL Server 2005 摘要:本文说明了如何使用 C# 和表值函数将空间搜索函数("邻近点的点"和"多边形内的点")添加到 Microsoft SQL Server 2005.使用此库可以在不编写任何特殊代码的情况下向应用程序中添加空间搜索.此库实现了来自约翰霍普金丝大学的公共域

在SQL Server 2005的ddl触发器中使用eventdata()函数

问题 在您的服务器实例中,针对SQL Server 2005的提示里,在运行数据定义语言 (Create,Alter,Drop)的命令中,你就可以看到如何跟踪DDL的活动,但我们如何 存储这些事件,用来捕获这些DDL触发器并且存储在表中为反馈的信息呢? Solution解决方案 在SQL Server 2005中 ,您可以通过访问eventdata ( )函数,用来触发ddl事 件而获取数据. 这个函数返回的是服务器或数据库事件的信息,并以XML数据类 型的方式储存在一个变量中使用. 我们需要做

SQL Server 2005 MD5函数

原文:SQL Server 2005 MD5函数 在SQL Server 2005下自带的函数HashBytes() ,此函数是微软在SQL Server 2005中提供的,可以用来计算一个字符串的MD5和SHA1值,使用方法如下: --获取123456的MD5加密串 select hashbytes('MD5', '123456') ; --获取123456的SHA1加密串 select hashbytes('SHA1', '123456') ; 有了这个函数可以在SQL Server中为字符

SQL Server 2005新特性

一.企业级数据管理 在当今的互联世界中,数据和管理数据的系统必须始终为用户可用且能够确保安全,有了SQL Server 2005,组织内的用户和IT专家将从减少应用程序宕机时间.提高可伸缩性及性能.更紧密的安全控制中获益.SQL Server 2005 也包括了很多新的和改进的功能来帮助企业的IT团队更有效率的工作.SQL Server 2005 包括了几个在企业级数据管理中关键的增强: 易管理 可用性 可伸缩性 安全性 1.易管理 SQL Server 2005 能够更为简单的部署.管理和优化

SQL Server 2005中的DDL触发器的实现

server|触发器     SQL SERVER 2005中,新增加了许多新的特性,其中的DDL触发器是个不错的选择,根据资料初步学习如下,现整理之:    在sql server 2000中,只能为针对表发出的 DML 语句(INSERT.UPDATE 和 DELETE)定义 AFTER 触发器.SQL Server 2005 可以就整个服务器或数据库的某个范围为 DDL 事件定义触发器.可以为单个 DDL 语句(例如,CREATE_TABLE)或者为一组语句(例如,DDL_DATABASE

在SQL Server 2005中实现表的行列转换

PIVOT和UNPIVOT关系运算符是SQL Server 2005提供的新增功能,因此,对升级到SQL Server 2005的数据库使用PIVOT和UNPIVOT时,数据库的兼容级别必须设置为90(可以使用sp_dbcmptlevel存储过程设置兼容级别). 在查询的FROM子句中使用PIVOT和UNPIVOT,可以对一个输入表值表达式执行某种操作,以获得另一种形式的表.PIVOT运算符将输入表的行旋转为列,并能同时对行执行聚合运算.而UNPIVOT运算符则执行与PIVOT运算符相反的操作,

使用 SQL Server 2005中的 CLR 集成

本文描述了数据库应用程序开发人员和架构师如何利用 SQL Server 2005 中的 CLR 集成功能.本文对基于 CLR 的编程方式与 SQL Server 中支持的现有编程模型(如 TransacT-SQL 和扩展存储过程)进行了比较,并且强调了各自相对的优缺点.还提供了一组选择合适的编程替代方法的高级指导,以及一些示例和代码示例. 一.简介 Microsoft 通过宿主 Microsoft .NET Framework 2.0 公共语言运行库 (CLR),SQL Server 2005显

Microsoft SQL Server 2005 中的 XML 支持(3)

四.SQL Server 2005 中的客户端 XML 处理 XML 数据类型的客户端支持.NET 框架 V2.0 中的 ADO.NET XML 支持 在 SqlDataReader.GetSqlXml() 方法的 System.Data.SqlTypes 命名空间中,XML 数据类型是作为类 SqlXml 公开的.可以使用 SqlXml.CreateReader() 函数从 SqlXml 对象获得 XmlReader. 类型化 XML 列的 XML 架构集合的名称由三部分组成,可以从 XML

Microsoft SQL Server 2005 中的 XML 支持(1)

本文探讨 SQL Server 2005 中内置的 XML 支持.描述了这种支持如何与 .NET 框架 V2.0 和本机代码(例如 OLEDB 和 SQLXML)均支持的客户端编程相集成. 一.简介 可扩展标记语言 (XML) 作为一种与平台无关的数据表示形式已被广泛采用.它对于在松散耦合且完全不同的系统,以及各种企业到企业 (B2B) 应用和工作流范畴内交换信息是很有用的.数据交换已成为 XML 技术的主要驱动力之一.. XML 在企业应用程序中的使用正日益广泛,它主要用于对半结构化和非结构化

通过 SQL Server 2005 索引视图提高性能

本文介绍了 SQL Server 2005 Enterprise Edition 中经过改进的索引视图功能.文中对索引视图进行了说明介绍,并讨论了可通过该功能改善性能的一些具体情况 一.索引视图 多年以来,Microsoft SQL Server 一直支持创建称为视图的虚拟表.通常,这些视图的主要作用是: • 提供一种安全机制,将用户限制到一个或多个基表的某个数据子集中. • 提供一种机制,允许开发人员自定义用户通过逻辑方式查看存储在基表中的数据的方式. 通过 SQL Server 2000,S