Transact-SQL 参考  
CREATE FUNCTION
创建用户定义函数,它是返回值的已保存的 Transact-SQL 例程。用户定义函数不能用于执行一组修改全局数据库状态的操作。与系统函数一样,用户定义函数可以从查询中唤醒调用。也可以像存储过程一样,通过 EXECUTE 语句执行。用户定义函数用 ALTER FUNCTION 修改,用 DROP FUNCTION 除去。语法
标量函数CREATE FUNCTION [ owner_name.] function_name
    ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] ) RETURNS scalar_return_data_type[ WITH < function_option> [ [,] ...n] ] [ AS ]BEGIN
    function_body
    RETURN scalar_expression
END内嵌表值函数CREATE FUNCTION [ owner_name.] function_name
    ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] ) RETURNS TABLE [ WITH < function_option > [ [,] ...n ] ] [ AS ]RETURN [ ( ] select-stmt [ ) ]多语句表值函数CREATE FUNCTION [ owner_name.] function_name
    ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] ) RETURNS @return_variable TABLE < table_type_definition >[ WITH < function_option > [ [,] ...n ] ] [ AS ]BEGIN
    function_body
    RETURN
END< function_option > ::=
    { ENCRYPTION | SCHEMABINDING }< table_type_definition > ::= 
    ( { column_definition | table_constraint } [ ,...n ] ) 
参数
owner_name拥有该用户定义函数的用户 ID 的名称。owner_name 必须是现有的用户 ID。function_name用户定义函数的名称。函数名称必须符合标识符的规则,对其所有者来说,该名称在数据库中必须是唯一的。@parameter_name用户定义函数的参数。CREATE FUNCTION 语句中可以声明一个或多个参数。函数最多可以有 1,024 个参数。函数执行时每个已声明参数的值必须由用户指定,除非该参数的默认值已经定义。 如果函数的参数有默认值,在调用该函数时必须指定"default"关键字才能获得默认值。这种行为不同于存储过程中有默认值的参数,在存储过程中省略参数也意味着使用默认值。使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个函数的参数仅用于该函数本身;相同的参数名称可以用在其它函数中。参数只能代替常量;而不能用于代替表名、列名或其它数据库对象的名称。scalar_parameter_data_type参数的数据类型。所有标量数据类型(包括 bigint 和 sql_variant)都可用作用户定义函数的参数。不支持 timestamp 数据类型和用户定义数据类型。不能指定非标量类型(例如 cursor 和 table)。scalar_return_data_type是标量用户定义函数的返回值。scalar_return_data_type 可以是 SQL Server 支持的任何标量数据类型(text、ntext、image 和 timestamp 除外)。scalar_expression指定标量函数返回的标量值。 TABLE指定表值函数的返回值为表。在内嵌表值函数中,通过单个 SELECT 语句定义 TABLE 返回值。内嵌函数没有相关联的返回变量。在多语句表值函数中,@return_variable 是 TABLE 变量,用于存储和累积应作为函数值返回的行。 function_body指定一系列 Transact-SQL 语句定义函数的值,这些语句合在一起不会产生副作用。function_body 只用于标量函数和多语句表值函数。在标量函数中,function_body 是一系列合起来求得标量值的 Transact-SQL 语句。在多语句表值函数中,function_body 是一系列填充表返回变量的 Transact-SQL 语句。select-stmt是定义内嵌表值函数返回值的单个 SELECT 语句。ENCRYPTION指出 SQL Server 加密包含 CREATE FUNCTION 语句文本的系统表列。使用 ENCRYPTION 可以避免将函数作为 SQL Server 复制的一部分发布。SCHEMABINDING指定将函数绑定到它所引用的数据库对象。如果函数是用 SCHEMABINDING 选项创建的,则不能更改(使用 ALTER 语句)或除去(使用 DROP 语句)该函数引用的数据库对象。函数与其所引用对象的绑定关系只有在发生以下两种情况之一时才被解除: 除去了函数。
在未指定 SCHEMABINDING 选项的情况下更改了函数(使用 ALTER 语句)。 
只有在满足以下条件时,函数才能绑定到架构: 该函数所引用的用户定义函数和视图也已绑定到架构。
该函数所引用的对象不是用两部分名称引用的。 
该函数及其引用的对象属于同一数据库。
执行 CREATE FUNCTION 语句的用户对所有该函数所引用的数据库对象都具有 REFERENCES 权限。 
如果不符合以上条件,则指定了 SCHEMABINDING 选项的 CREATE FUNCTION 语句将失败。注释
用户定义函数为标量值函数或表值函数。如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数。可以使用多条 Transact-SQL 语句定义标量值函数。如果 RETURNS 子句指定 TABLE,则函数为表值函数。根据函数主体的定义方式,表值函数可分为行内函数或多语句函数。如果 RETURNS 子句指定的 TABLE 不附带列的列表,则该函数为行内函数。行内函数是使用单个 SELECT 语句定义的表值函数,该语句组成了函数的主体。该函数返回的表的列(包括数据类型)来自定义该函数的 SELECT 语句的 SELECT 列表。如果 RETURNS 子句指定的 TABLE 类型带有列及其数据类型,则该函数是多语句表值函数。多语句函数的主体中允许使用以下语句。未在下面的列表中列出的语句不能用在函数主体中。 赋值语句。
控制流语句。
DECLARE 语句,该语句定义函数局部的数据变量和游标。
SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句;不允许使用将数据返回到客户端的 FETCH 语句。
INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。
EXECUTE 语句调用扩展存储过程。 
函数的确定性和副作用
函数可以是确定的或不确定的。如果任何时候用一组特定的输入值调用函数时返回的结果总是相同的,则这些函数为确定的。如果每次调用函数时即使用的是相同的一组特定输入值,返回的结果总是不同的,则这些函数为不确定的。不确定的函数会产生副作用。副作用是更改数据库的某些全局状态,比如更新数据库表或某些外部资源,如文件或网络等(例如,修改文件或发送电子邮件消息)。不允许在用户定义函数主体中内置不确定函数;这些不确定函数如下:@@CONNECTIONS @@TOTAL_ERRORS 
@@CPU_BUSY @@TOTAL_READ 
@@IDLE @@TOTAL_WRITE 
@@IO_BUSY GETDATE 
@@MAX_CONNECTIONS GETUTCDATE 
@@PACK_RECEIVED NEWID 
@@PACK_SENT RAND 
@@PACKET_ERRORS TEXTPTR 
@@TIMETICKS   
尽管在用户定义函数主体中不允许有不确定函数,这些用户定义函数在调用扩展存储过程时仍会产生副作用。由于扩展存储过程会对数据库产生副作用,因此调用扩展存储过程的函数是不确定的。当用户定义函数调用会对数据库产生副作用的扩展存储过程时,不要指望结果集保持一致或执行函数。 从函数中调用扩展存储过程
从函数内部调用时扩展存储过程无法向客户端返回结果集。任何向客户端返回结果集的 ODS API 都将返回 FAIL。扩展存储过程可以连接回 Microsoft&reg; SQL Server&#8482;;但是,它不应尝试联接与唤醒调用扩展存储过程的函数相同的事务。与从批处理或存储过程中唤醒调用相似,扩展存储过程在运行 SQL Server 的 Windows&reg; 安全帐户的上下文中执行。存储过程的所有者在授予用户 EXECUTE 特权时应考虑这一点。函数调用
在可使用标量表达式的位置可唤醒调用标量值函数,包括计算列和 CHECK 约束定义。当唤醒调用标量值函数时,至少应使用函数的两部分名称。[database_name.]owner_name.function_name ([argument_expr][,...])如果用户定义函数用于定义计算列,则该函数的确定性同样决定了是否可在该计算列上创建索引。只有当函数具有确定性时,才可以在使用该函数的计算列上创建索引。如果在输入相同的情况下函数始终返回相同的值,则该函数具有确定性。可以使用由一部分组成的名称唤醒调用表值函数。[database_name.][owner_name.]function_name ([argument_expr][,...])对于 Microsoft&reg; SQL Server&#8482; 2000 中包含的系统表函数,唤醒调用时需在函数名的前面加上前缀"::"。SELECT *
FROM ::fn_helpcollations()对于导致语句停止执行然后从存储过程中的下一语句继续执行的 Transact-SQL 错误,在函数中的处理方式不同。在函数中,这类错误会导致函数停止执行。这反过来使唤醒调用该函数的语句停止执行。权限
用户应具有执行 CREATE FUNCTION 语句的 CREATE FUNCTION 权限。CREATE FUNCTION 的权限默认地授予 sysadmin 固定服务器角色和 db_owner 和 db_ddladmin 固定数据库角色的成员。sysadmin 和 db_owner 的成员可用 GRANT 语句将 CREATE FUNCTION 权限授予其它登录。函数的所有者对其函数具有 EXECUTE 权限。其他用户不具有 EXECUTE 权限,除非给他们授予了特定函数上的 EXECUTE 权限。若要创建或更改在 CONSTRAINT、DEFAULT 子句或计算列定义中引用了用户定义函数的表,用户还必须对这些函数有 REFERENCES 权限。示例
A. 计算 ISO 周的标量值用户定义函数
下例中,用户定义函数 ISOweek 取日期参数并计算 ISO 周数。为了正确计算该函数,必须在调用该函数前唤醒调用 SET DATEFIRST 1。 CREATE FUNCTION ISOweek  (@DATE datetime)
RETURNS int
AS
BEGIN
   DECLARE @ISOweek int
   SET @ISOweek= DATEPART(wk,@DATE)+1
      -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
   IF (@ISOweek=0) 
      SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1 
         AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
   IF ((DATEPART(mm,@DATE)=12) AND 
      ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
      SET @ISOweek=1
   RETURN(@ISOweek)
END下面是函数调用。注意 DATEFIRST 设置为 1。SET DATEFIRST 1
SELECT master.dbo.ISOweek('12/26/1999') AS 'ISO Week'
下面是结果集。ISO Week
----------------
52B. 内嵌表值函数
下例返回内嵌表值函数。USE pubs
GO
CREATE FUNCTION SalesByStore (@storeid varchar(30))
RETURNS TABLE
AS
RETURN (SELECT title, qty
      FROM sales s, titles t
      WHERE s.stor_id = @storeid and
      t.title_id = s.title_id)C. 多语句表值函数
假设有一个表代表如下的层次关系: CREATE TABLE employees (empid nchar(5) PRIMARY KEY, 
      empname nvarchar(50), 
      mgrid nchar(5) REFERENCES employees(empid), 
      title nvarchar(30)
      )表值函数 fn_FindReports(InEmpID) 有一个给定的职员ID,它返回与所有直接或间接向给定职员报告的职员相对应的表。该逻辑无法在单个查询中表现出来,不过可以实现为用户定义函数。 CREATE FUNCTION fn_FindReports (@InEmpId nchar(5))
RETURNS @retFindReports TABLE (empid nchar(5) primary key,
   empname nvarchar(50) NOT NULL,
   mgrid nchar(5),
   title nvarchar(30))
/*Returns a result set that lists all the employees who report to given 
employee directly or indirectly.*/
AS
BEGIN
   DECLARE @RowsAdded int
   -- table variable to hold accumulated results
   DECLARE @reports TABLE (empid nchar(5) primary key, 
      empname nvarchar(50) NOT NULL,
      mgrid nchar(5),
      title nvarchar(30),
      processed tinyint default 0)
-- initialize @Reports with direct reports of the given employee 
   INSERT @reports
   SELECT empid, empname, mgrid, title, 0
   FROM employees 
   WHERE empid = @InEmpId 
   SET @RowsAdded = @@rowcount
   -- While new employees were added in the previous iteration
   WHILE @RowsAdded > 0
   BEGIN
      /*Mark all employee records whose direct reports are going to be 
   found in this iteration with processed=1.*/
      UPDATE @reports
      SET processed = 1
      WHERE processed = 0
      -- Insert employees who report to employees ed 1.
      INSERT @reports
      SELECT e.empid, e.empname, e.mgrid, e.title, 0
      FROM employees e, @reports r
      WHERE e.mgrid=r.empid and e.mgrid <> e.empid and r.processed = 1
      SET @RowsAdded = @@rowcount
      /*Mark all employee records whose direct reports have been found
   in this iteration.*/
      UPDATE @reports
      SET processed = 2
      WHERE processed = 1
   END
   
   -- copy to the result of the function the required columns
   INSERT @retFindReports
   SELECT empid, empname, mgrid, title 
   FROM @reports
   RETURN
END
GO-- Example invocation
SELECT * 
FROM fn_FindReports('11234')
GO
请参见ALTER FUNCTIONDROP FUNCTION唤醒调用用户定义函数用户定义函数&copy;1988-2000 Microsoft Corporation。保留所有权利。大型数据库都有。以上是SQL的HELP

解决方案 »

  1.   

    dwind:
       实现太厉害了,假如能实现话。
       但是为什么我在MSSQL6.5和MSSQL7.0的帮助中都找不到有关Create function的帮助?
       我也试图在MSSQL7.0中用如下语句建立函数: Create function test as ...
    系统返回无效语句。
       是不是在MSSQL2000中才有?
      

  2.   

    SQL SERVER 2000 新特性:
    第一章 预备知识
    1 数据完整性
    数据完整性指的是数据的准确性和一致性。
    1.1 数据完整性的分类
    数据完整性有四种类型:
    A. 域完整性
    B. 实体完整性
    C. 引用完整性
    D. 用户定义完整性
    1.2 强制数据完整性的方法
    1.2.1 定义数据完整性
    &sup2; 在对象定义中定义的标准
    &sup2; 由SQL自动强制执行
    &sup2; 通过约束、缺省值和规则实现
    1.2.2 过程数据完整性
    &sup2; 在脚本定义中定义的标准
    &sup2; 由脚本强制执行
    &sup2; 通过存储过程和触发器实现1.3 方法的选用
    方法 性能 耗费资源 事务前后
    约束 中 低 前
    缺省值和规则 低 中 前
    触发器 高 高 可定义2 存储过程3 触发器
    3.1 优点
    &sup2; 通过相关表实现级联更改
    &sup2; 强制比CHECK约束更为复杂的规则
    &sup2; 可以引用其它表中的列
    &sup2; 可以评估数据修改前后的表的状态,并根据其差异采取对策
    &sup2; 一个表中的同类触发器允许采取多个不同的对策以响应同一修改语句。
    3.2 注意事项
    &sup2; CREATE TRIGGER语句必须是批中的第一个语句,随后的语句解释为触发器定义的一部分
    &sup2; 创建的权限默认分配给表的所有者,且不可转移
    &sup2; 命名规则必须满足数据库对象命名规则
    &sup2; 虽然出发器可以引用当前数据库以外的对象,但是只能在当前数据库中创建
    &sup2; 不能在临时表或系统表上创建触发器,但是可以引用临时表,不应引用系统表
    &sup2; 在含有用DELETE或UPDATE操作定义的外键的表中,不能定义INSTEAD OF DELETE和INSTEAD OF UPDATE触发器。
    &sup2; TRUNCATE TABLE语句不触发DELETE触发器第二章 Instead of触发器
    1 Instead of 触发器与After触发器
    二者的比较见下表:
    功能 AFTER触发器 INSTEAD OF触发器
    使用范围 表 表和视图
    触发器数 每个触发动作有多个触发器 每个触发动作含一个触发器
    级联引用 不应用任何限制 在作为级联引用完整性约束目标的表上限制应用
    执行 晚于:约束处理,声明引用操作,INSERTED和DELETED表的创建,出发动作 早于:约束处理,代替:出发动作晚于:INSERTED和DELETED表的创建
    执行顺序 可指定第一个和最后一个执行 不可以
    在INSERTED和DELETED表中引用TEXT、NTEXT和 IMAGE列 不允许 允许2 Instead of触发器的用途
    &sup2; 在约束之前触发
    &sup2; 使不能更新的视图支持更新
    &sup2; 修改表或者视图上的原始的更新(INSERT、DELETE、UPDATE)的定义
    3使用Instead of触发器
    使用Instead of触发器的视图的Insert语句必须为每个不允许为空的视图列提供值。包括不能为其指定输入值的基表列的的视图列:
    &sup2; 基表中的计算列;
    &sup2; IDENTITY INSERT为OFF的基表中的表示列;
    &sup2; 具有timestamp数据类型的基表列。
    如果INSTEAD OF INSERT视图触发器使用INSERTED表中的数据对基表生成INSERT,则它应当通过排除INSERT语句选择列表中的列忽略这些类型的值。
    在表上指定的INSTEAD OF INSERT触发器和在视图上指定的INSEAD OF INSERT触发器,其INSERTED表中含有的计算列、标识列和timestamp列的值不同。INSEAT OF INSERT触发器的DELETED表总是空的。
    基表列 表上任何INSERT触发器的INSERTED表中的值 试图上的INSTEAD OF INSERT触发器INSERTED表中的值
    是计算列 计算表达式 用户指定值或NULL值
    具有IDENTITY属性 如果IDENTITY_INSERT为OFF,则为0。否则为指定值 用户指定值或NULL值
    具有timestamp数据类型 若该列不允许为空值则为二进制零,若该列允许为空值则为NULL 用户指定值或NULL值第三章 分区视图
    1 什么是分区视图
    分区视图在一个或者多个服务器之间水平连接一组成员表中的分区数据,使数据看起来就象来自一个表。
    1.1 分区视图的类型
    &sup2; 本地分区视图。所有的表和视图驻留在同一个SQL Server实例上。
    &sup2; 分布式分区视图。至少有一个参与表驻留在不同的(远程)服务器上。
    1.2 为什么使用分区视图
    分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但是它们协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制使你能够扩大一组服务器,以支持大型的多层WEB站点的处理需要。
    2 如何创建分区视图
    2.1 创建基表
    在实现分区视图以前,必须先水平分区表。原始表被分成若干个较小的成员表。每个成员表包含与原始表相同数量的列,并且每一列具有与原始表中的相应的列同样的属性(如数据类型、大小、排序规则)。如果正在创建分布式分区视图,则每个成员表分别位于不同的服务器上。为了获得最大程度的位置透明度,各个成员服务器似的成员数据库的名称应当是相同的,但不是要求非这样。
    2.2 分区数值
    成员表设计好以后,每个表基于键值的范围存储原始表的一块水平区域。键值范围基于分区列中的数据值。每一成员表中的值的范围通过分区列上的CHECK约束强制,并且范围之间不能重叠。
    2.3 创建分区视图
    在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行,系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个成员服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。
    3 SQL2000分区视图增强
    SQL2000中分区视图的增强
    特性 SQL Server70 SQL Server2000
    本地/分布式 仅仅本地 分布式:基于多服务器(仅企业版)
    是否可更新 否 是
    隐藏成员表 编译时 编译时和运行时4 分区视图规则
    4.1 成员表规则
    成员表在视图定义中的每个SELECT语句的FROM子句中定义,每个成员表必须遵守如下规则:
    &sup2; 每个成员表只能引用一次
    &sup2; 成员表不能有任何计算列上创建的索引
    &sup2; 成员表具有的PRIMARY KEY约束在数目相同的列上
    &sup2; 成员表必须有相同的ANSI填充设置
    4.2 列规则
    列在视图定义中的每个SELECT语句的选择列表中定义,列必须遵守如下规则:
    &sup2; 每个成员表的所有列必须包含在选择列表中
    &sup2; 在选择列表中不能多次使用同一列
    &sup2; 列不许位于选择列表中的相同序号位置处
    &sup2; 每个SELECT语句的选择列表中的列必须是同一类型(包括数据类型、精度、小数位数和排序规则)
    4.3 分区列规则
    分区列存在于每个成员表上,并且通过CHECK约束标识特定表中的可用数据,分区列必须遵守如下规则:
    &sup2; 每个基表都拥有键值由CHECK约束所强制的分区列。每个表的CHECK约束的键范围与其它任何表互不重叠。任何分区列的给定值必须只能映射到一个表。CHECK约束只能使用以下运算符:BETWEEN、AND、OR、<、>、>=、<=、=
    &sup2; 在试图中分区列必须位于每个SELECT语句的选择列表中相同的序号位置处
    &sup2; 不允许为空
    &sup2; 必须是表的主键的一部分
    &sup2; 不能是计算列
    &sup2; 在分区列上必须仅有一个约束。如果有多于一个的约束,SQL Server会忽略所有的约束并在确定视图是否为分区视图时不考虑这些约束
    满足上述规则的分区列将支持SQL Server2000查询优化器支持的所有优化。第四章 用户定义函数
    在SQL Server2000中支持两种函数:
    &sup2; 内置函数
    &sup2; 用户定义函数
    1 用户定义函数的类型
    在SQL Server2000中支持三种用户定义函数:
    &sup2; 标量函数。返回RETURNS子句中定义的单个数值。可以使用所有标量数据类型,包括bigint和sql-variant。不支持用户定义数据类型、非标量类型(如table或cursor)和timestamp、ntext、text、image数据类型。
    &sup2; 内嵌表函数。返回table,没有函数主体,表是单个SELECT语句的结果集。
    &sup2; 多语句表值函数。返回table,在BEGIN……END块中定义的函数主体包含TRANSACT-SQL语句,这些语句可生成并将行插入将返回的表中。
    1.1 架构绑定函数
    CREATE FUNCTION支持SCHEMABINDING子句,后者可将函数绑定到它引用的任何对象(如表、视图、和其它用户定义函数)的架构。尝试对架构绑定函数所引用的的任何对象执行ALTER或DROP都将失败。
    必须满足以下条件才能在CREATE FUNCTION中指定SCHEMACINDING:
    &sup2; 该函数所引用的所有视图和用户定义函数必须是绑定到架构的
    &sup2; 该函数所引用的所有对象必须与函数必须位于同一数据库中。必须使用由一部分或两部分构成的名称来引用对象。
    &sup2; 必须具有该函数中引用的所有对象(表、视图和用户定义函数)的REFERENCES权限。
    可以使用ALTER FUNCTION删除架构绑定。
    1.2 调用用户定义函数
    调用标量函数:
    &sup2; 必须提供至少由两部分组成的名称MyUser. MyScalarFunction()
    &sup2; 可以在TRANSACT-SQL语句中所允许的函数返回的相同数据类型表达式所在的任何位置引用标量函数,包括计算列和CHECK约束定义。
    &sup2; 示例
    调用表值函数:
    &sup2; 可以使用一部分名称调用表值函数
    &sup2; 然而当调用返回表的SQL Server内置函数时,必须将前缀::添加至函数名
    &sup2; 示例
    SELECT * FROM ::fn_helpcollations()
    SELECT * FROM MyTableFunction()
    2 确定函数和非确定函数
    所有函数都是确定性的或非确定性的:
    &sup2; 在使用特定的输入值集调用确定性函数的时候,它们总是返回相同的结果
    &sup2; 在每次使用特定的输入值集调用非确定性函数时,它们返回不同的结果
    函数是否为确定性函数或非确定性函数称为函数的确定性。
    为什么使用确定性函数:
    &sup2; 如果computed-column-expression引用任何非确定性函数,则不能在计算列上创建索引。
    &sup2; 如果视图引用任何非确定函数,则不能在视图上创建聚集索引。
    3 如何创建确定性函数
    用户定义函数的确定性取决于函数是如何编码的:
    &sup2; 函数是架构绑定函数
    &sup2; 所有由用户定义函数调用的函数(包括内置函数和其它用户定义函数)都是确定性函数。
    &sup2; 函数主体不引用该函数作用域以外的数据库对象。例如,确定性函数不能引用函数的局部表变量以外的表。
    &sup2; 该函数不调用任何扩展存储过程。
    4 使用视图和用户定义函数
    当需要搜索大量的数据的时候:
    1) 创建带有复杂统计的视图
    2) 在视图是创建聚集索引
    3) 创建内嵌函数筛选视图中的数据
    4) 用户从带有参数的内嵌函数得到数据
    5 如何将存储过程重新编写为函数
    一般说来如果存储过程返回一个(单个)结果集,则定义表值函数,如果存储过程计算标量值,则定义标量函数。
    如果存储过程满足以下条件,则可作为重新编写为表值函数的很好的候选存储过程:
    &sup2; 逻辑可在单个SELECT语句中表现,但它是存储过程而不是视图,只是由于需要参数。可使用内嵌表值函数处理这种情况。
    &sup2; 存储过程不执行更新操作(除了对表变量外)。
    &sup2; 不需要动态EXECUTE语句。
    &sup2; 存储过程返回一个结果集。
    &sup2; 存储过程的主要目的是生成要装载到临时表的中间结果,SELECT语句将随后查询临时表。
    并非所有的存储过程都要重写为函数,如果你想在查询中直接调用存储过程的话,DO IT。
    第五章 级联引用完整性
    1 五种约束
    SQL Server 2000 支持五种类型的约束:
    &sup2; 非空(NOT NULL)。决定该列不允许空值。
    &sup2; 检查(CHECK)。通过限制列的取值强制域完整性。
    &sup2; 唯一(UNIQUE)。在列集中强制值的唯一性。
    &sup2; 主键(PRIMARY KEY)。定义表中某一列或列的组合,其值能唯一地标识表中的每一行。
    &sup2; 外键(FOREIGN KEY)。定义表之间的关系。
    2 级联引用完整性约束
    CREATE TABLE和ALTER TABLE语句的REFERENCES子句支持ON DELETE和ON UPDATE子句:
    &sup2; [ ON DELETE { CASCADE | NO ACTION } ]
    &sup2; [ ON UPDATE { CASCADE | NO ACTION } ] 
    单独的DELETE或UPDATE语句可以启动一系列级联引用操作。
    第六章 多样性
    新的数据类型
    &sup2; table,表。
    &sup2; bigint
    &sup2; sql-variant
    数据库级/表级的排序规则
    全文增强
    新的内置函数