<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      在SQL SERVER 2005創建用戶定義函數語法

      創建用戶定義函數。這是一個已保存 Transact-SQL 或公共語言運行時 (CLR) 例程,該例程可返回一個值。用戶定義函數不能用于執行修改數據庫狀態的操作。與系統函數一樣,用戶定義函數可從查詢中調用。標量函數和存儲過程一樣,可使用 EXECUTE 語句執行。

      用戶定義函數可使用 ALTER FUNCTION 修改,使用 DROP FUNCTION 刪除。

      主題鏈接圖標 Transact-SQL 語法約定

      語法

      Scalar Functions
      CREATE FUNCTION [ schema_name. ] function_name 
      ( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type 
          [ = default ] } 
          [ ,...n ]
        ]
      )
      RETURNS return_data_type
          [ WITH <function_option> [ ,...n ] ]
          [ AS ]
          BEGIN 
                      function_body 
              RETURN scalar_expression
          END
      [ ; ]
      
      Inline Table-valued Functions
      CREATE FUNCTION [ schema_name. ] function_name 
      ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
          [ = default ] } 
          [ ,...n ]
        ]
      )
      RETURNS TABLE
          [ WITH <function_option> [ ,...n ] ]
          [ AS ]
          RETURN [ ( ] select_stmt [ ) ]
      [ ; ]
      
      Multistatement Table-valued Functions
      CREATE FUNCTION [ schema_name. ] function_name 
      ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
          [ = default ] } 
          [ ,...n ]
        ]
      )
      RETURNS @return_variable TABLE < table_type_definition >
          [ WITH <function_option> [ ,...n ] ]
          [ AS ]
          BEGIN 
                      function_body 
              RETURN
          END
      [ ; ]
      
      CLR Functions
      CREATE FUNCTION [ schema_name. ] function_name 
      ( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type 
              [ = default ] } 
          [ ,...n ]
      )
      RETURNS { return_data_type | TABLE <clr_table_type_definition> }
          [ WITH <clr_function_option> [ ,...n ] ]
          [ AS ] EXTERNAL NAME <method_specifier>
      [ ; ]
      
      Method Specifier
      <method_specifier>::=
          assembly_name.class_name.method_name
      
      Function Options
      <function_option>::= 
      {
          [ ENCRYPTION ]
        | [ SCHEMABINDING ]
        | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
        | [ EXECUTE_AS_Clause ]
      }
      
      <clr_function_option>::=
      }
          [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
        | [ EXECUTE_AS_Clause ]
      }
      
      Table Type Definitions
      <table_type_definition>:: = 
      ( { <column_definition> <column_constraint> 
        | <computed_column_definition> } 
              [ <table_constraint> ] [ ,...n ]
      ) 
      
      <clr_table_type_definition>::= 
      ( { column_name data_type } [ ,...n ] )
      
      <column_definition>::=
      {
          { column_name data_type }
          [ [ DEFAULT constant_expression ] 
            [ COLLATE collation_name ] | [ ROWGUIDCOL ]
          ]
          | [ IDENTITY [ (seed , increment ) ] ]
          [ <column_constraint> [ ...n ] ] 
      }
      <column_constraint>::= 
      {
          [ NULL | NOT NULL ] 
          { PRIMARY KEY | UNIQUE }
            [ CLUSTERED | NONCLUSTERED ] 
              [ WITH FILLFACTOR = fillfactor 
              | WITH ( < index_option > [ , ...n ] )
            [ ON { filegroup | "default" } ]
        | [ CHECK ( logical_expression ) ] [ ,...n ]
      }
      
      <computed_column_definition>::=
      column_name AS computed_column_expression 
      
      <table_constraint>::=
      { 
          { PRIMARY KEY | UNIQUE }
            [ CLUSTERED | NONCLUSTERED ] 
                  ( column_name [ ASC | DESC ] [ ,...n ] )
              [ WITH FILLFACTOR = fillfactor 
              | WITH ( <index_option> [ , ...n ] )
        | [ CHECK ( logical_expression ) ] [ ,...n ]
      }
      
      <index_option>::=
      { 
          PAD_INDEX = { ON | OFF }   | FILLFACTOR = fillfactor 
        | IGNORE_DUP_KEY = { ON | OFF }
        | STATISTICS_NORECOMPUTE = { ON | OFF } 
        | ALLOW_ROW_LOCKS = { ON | OFF }
        | ALLOW_PAGE_LOCKS ={ ON | OFF } 
      }

      備注

      用戶定義函數為標量值函數或表值函數。如果 RETURNS 子句指定了一種標量數據類型,則函數為標量值函數??梢允褂枚鄺l Transact-SQL 語句定義標量值函數。

      如果 RETURNS 子句指定 TABLE,則函數為表值函數。根據函數主體的定義方式,表值函數可分為內聯函數或多語句函數。有關詳細信息,請參閱表值用戶定義函數。

      下列語句在函數內有效:

      • 賦值語句。

      • TRY...CATCH 語句以外的流控制語句。

      • 定義局部數據變量和局部游標的 DECLARE 語句。

      • SELECT 語句,其中的選擇列表包含為局部變量分配值的表達式。

      • 游標操作,該操作引用在函數中聲明、打開、關閉和釋放的局部游標。只允許使用以 INTO 子句向局部變量賦值的 FETCH 語句;不允許使用將數據返回到客戶端的 FETCH 語句。

      • 修改 table 局部變量的 INSERT、UPDATE 和 DELETE 語句。

      • 調用擴展存儲過程的 EXECUTE 語句。

      • 有關詳細信息,請參閱創建用戶定義函數(數據庫引擎)。

      嵌套用戶定義函數

      用戶定義函數可以嵌套;也就是說,用戶定義函數可相互調用。被調用函數開始執行時,嵌套級別將增加;被調用函數執行結束后,嵌套級別將減少。用戶定義函數的嵌套級別最多可達 32 級。如果超出最大嵌套級別數,整個調用函數鏈將失敗。

      注意:
      從 Transact-SQL 用戶定義函數對托管代碼的任何引用都將計入 32 級嵌套限制的一個級別。從托管代碼內部調用的方法不根據此限制進行計數。

      函數屬性

      在 SQL Server 的早期版本中,函數只能分為確定性函數和不確定性函數兩類。在 SQL Server 2005 中,函數具有下列屬性。這些屬性的值確定了函數是否可用于持久化計算列或索引計算列。

      屬性 說明 注意

      IsDeterministic

      函數是確定性函數還是不確定性函數。

      確定性函數中允許本地數據訪問。例如,如果每次使用一組特定輸入值和相同數據庫狀態調用函數時,函數都返回相同結果,則該函數將被標記為確定性函數。

      IsPrecise

      函數是精確函數還是不精確函數。

      不精確函數包含浮點運算之類的運算。

      IsSystemVerified

      SQL Server 可驗證函數的精度和確定性屬性。

       

      SystemDataAccess

      函數可以訪問 SQL Server 的本地實例中的系統數據(系統目錄或虛擬系統表)。

       

      UserDataAccess

      函數可以訪問 SQL Server 的本地實例中的用戶數據。

      包含用戶定義表和臨時表,但不包含表變量。

      Transact-SQL 函數的精度和確定性屬性由 SQL Server 自動確定。有關詳細信息,請參閱用戶定義函數的設計指導原則。CLR 函數的數據訪問權限和確定性屬性可由用戶指定。有關詳細信息,請參閱 Overview of CLR Integration Custom Attributes。

      若要顯示這些屬性的當前值,請使用 OBJECTPROPERTYEX

      對調用用戶定義函數的計算列進行索引

      如果用戶定義函數具有下列屬性值,則可以在索引中使用調用用戶定義函數的計算列:

      • IsDeterministic = true

      • IsSystemVerified = true(計算列是持久性計算列時除外)

      • UserDataAccess = false

      • SystemDataAccess = false

      有關詳細信息,請參閱為計算列創建索引。

      從函數中調用擴展存儲過程

      如果在函數中調用擴展存儲過程,則該過程不能向客戶端返回結果集。向客戶端返回結果集的任何 ODS API 都將返回 FAIL。擴展存儲過程可以連接回 SQL Server 的實例;不過,該過程不應嘗試與調用擴展存儲過程的函數同時聯接到同一事務。

      與通過批處理或存儲過程進行調用相似,擴展存儲過程在運行 SQL Server 的 Windows 安全帳戶的上下文中執行。存儲過程的所有者在授予用戶 EXECUTE 權限時應考慮這一點。

      函數調用

      可在使用標量表達式的位置調用標量值函數。這包括計算列和 CHECK 約束定義。也可以使用 EXECUTE 語句執行標量值函數。在允許表表達式的情況下,可在 SELECT、INSERT、UPDATE 或 DELETE 語句的 FROM 子句中調用表值函數。有關詳細信息,請參閱執行用戶定義函數(數據庫引擎)。

      在 CLR 函數中使用參數和返回值

      如果在 CLR 函數中指定了參數,則這些參數應為 SQL Server 類型,即以前為 scalar_parameter_data_type 定義的類型。有關將 SQL Server 系統數據類型與 CLR 集成數據類型或 .NET Framework 公共語言運行時數據類型進行比較的信息,請參閱 SQL Server Data Types and Their .NET Framework Equivalents。

      為了使 SQL Server 在類中重載時引用正確方法,<method_specifier> 中指示的方法必須具有下列特征:

      • 接收 [ ,...n ] 中指定的參數數量。

      • 通過值而不是引用來接收所有參數。

      • 使用與 SQL Server 函數中指定的類型兼容的參數類型。

      如果 CLR 函數的返回數據類型指定表類型 (RETURNS TABLE),則 <method_specifier> 中方法的返回數據類型應為 IEnumerator 或 IEnumerable 類型,且假定由函數創建者來實現接口。與 Transact-SQL 函數不同,CLR 函數不能在 <table_type_definition> 中包含 PRIMARY KEY、UNIQUE 或 CHECK 約束。 <table_type_definition> 中指定的列的數據類型,必須與 <method_specifier> 中的方法在執行時返回的結果集中的對應列的類型匹配。創建函數時不執行上述類型檢查。

      有關對 CLR 函數編程的詳細信息,請參閱 CLR User-Defined Functions

      不允許的 SQL 語句

      下列 Service Broker 語句不能包含在 Transact-SQL 用戶定義函數的定義中:

      • BEGIN DIALOG CONVERSATION

      • END CONVERSATION

      • GET CONVERSATION GROUP

      • MOVE CONVERSATION

      • RECEIVE

      • SEND

      查看有關函數的信息

      若要顯示 Transact-SQL 用戶定義函數的定義,請使用函數所在數據庫中的 sys.sql_modules 目錄視圖。

      例如:

      復制代碼
      USE AdventureWorks;
      GO
      SELECT Definition 
      FROM sys.sql_modules AS m
      JOIN sys.objects AS o ON m.object_id = o.object_id 
          AND TYPE IN ('FN', 'IF', 'TF');
      GO
      注意:
      不能使用 sys.sql_modules 查看使用 ENCRYPTION 選項創建的函數定義;不過,可顯示有關加密函數的其他信息。

      若要顯示有關 CLR 用戶定義函數的信息,請使用函數所在數據庫中的 sys.assembly_modules 目錄視圖。

      若要顯示有關用戶定義函數中定義的參數的信息,請使用函數所在數據庫中的 sys.parameters 目錄視圖。

      若要顯示有關函數引用的對象的報表,請使用 sys.sql_dependencies

      參數

      schema_name

      用戶定義函數所屬的架構的名稱。

      function_name

      用戶定義函數的名稱。函數名稱必須符合有關標識符的規則,并且在數據庫中以及對其架構來說是唯一的。

      注意:
      即使未指定參數,函數名稱后也需要加上括號。

      @parameter_name

      用戶定義函數的參數。可聲明一個或多個參數。

      函數最多可以有 1,024 個參數。執行函數時,如果未定義參數的默認值,則用戶必須提供每個已聲明參數的值。

      通過將 at 符號 (@) 用作第一個字符來指定參數名稱。參數名稱必須符合有關標識符的規則。參數是對應于函數的局部參數;其他函數中可使用相同的參數名稱。參數只能代替常量,而不能用于代替表名、列名或其他數據庫對象的名稱。

      注意:
      在存儲過程或用戶定義函數中傳遞參數時,或在批語句中聲明和設置變量時,不會遵守 ANSI_WARNINGS。例如,如果將變量定義為 char(3) 類型,然后將其值設置為多于三個字符,則數據將截斷為定義大小,并且 INSERT 或 UPDATE 語句可以成功執行。

      [ type_schema_name. ] parameter_data_type

      參數的數據類型及其所屬的架構,后者為可選項。對于 Transact-SQL 函數,可以使用除 timestamp 數據類型之外的所有數據類型(包括 CLR 用戶定義類型)。對于 CLR 函數,可以使用除 text、ntext、image 和 timestamp 數據類型之外的所有數據類型(包括 CLR 用戶定義類型)。不能將非標量類型 cursor 和 table 指定為 Transact-SQL 函數或 CLR 函數中的參數數據類型。

      如果未指定 type_schema_name,則 SQL Server 2005 Database Engine 將按以下順序查找 scalar_parameter_data_type:

      • 包含 SQL Server 系統數據類型名稱的架構。

      • 當前數據庫中當前用戶的默認架構。

      • 當前數據庫中的 dbo 架構。

      [ = default ]

      參數的默認值。如果定義了 default 值,則無需指定此參數的值即可執行函數。

      注意:
      可以為除 varchar(max) 和 varbinary(max) 數據類型之外的 CLR 函數指定默認參數值。

      如果函數的參數有默認值,則該函數檢索默認值時必須指定 DEFAULT 關鍵字。此行為與在存儲過程中使用具有默認值的參數不同,在后一種情況下,不提供參數同樣意味著使用默認值。

      return_data_type

      標量用戶定義函數的返回值。對于 Transact-SQL 函數,可以使用除 timestamp 數據類型之外的所有數據類型(包括 CLR 用戶定義類型)。對于 CLR 函數,可以使用除 text、ntext、image 和 timestamp 數據類型之外的所有數據類型(包括 CLR 用戶定義類型)。不能將非標量類型 cursor 和 table 指定為 Transact-SQL 函數或 CLR 函數中的返回數據類型。

      function_body

      指定一系列定義函數值的 Transact-SQL 語句,這些語句在一起使用不會產生負面影響(例如修改表)。function_body 僅用于標量函數和多語句表值函數。

      在標量函數中,function_body 是一系列 Transact-SQL 語句,這些語句一起使用的計算結果為標量值。

      在多語句表值函數中,function_body 是一系列 Transact-SQL 語句,這些語句將填充 TABLE 返回變量。

      scalar_expression

      指定標量函數返回的標量值。

      TABLE

      指定表值函數的返回值為表。只有常量和 @local_variables 可以傳遞到表值函數。

      在內聯表值函數中,TABLE 返回值是通過單個 SELECT 語句定義的。內聯函數沒有關聯的返回變量。

      在多語句表值函數中,@return_variable 是 TABLE 變量,用于存儲和匯總應作為函數值返回的行。只能將 @return_variable 指定用于 Transact-SQL 函數,而不能用于 CLR 函數。

      select_stmt

      定義內聯表值函數的返回值的單個 SELECT 語句。

      EXTERNAL NAME <method_specifier>, assembly_name.class_name.method_name

      指定將程序集與函數綁定的方法。assembly_name 必須與 SQL Server 中當前數據庫內具有可見性的現有程序集匹配。class_name 必須是有效的 SQL Server 標識符,并且必須作為類存在于程序集中。如果類具有以命名空間限定的名稱,該名稱使用句點 (.) 來分隔命名空間的各部分,則必須使用方括號 ([ ]) 或引號 (" ") 分隔類名稱。method_name 必須是有效的 SQL Server 標識符,并且必須作為靜態方法存在于指定類中。

      注意:
      默認情況下,SQL Server 不能執行 CLR 代碼??梢詣摻ā⑿薷暮蛣h除引用公共語言運行時模塊的數據庫對象;不過,只有在啟用 clr enabled 選項之后,才能在 SQL Server 中執行這些引用。若要啟用此選項,請使用 sp_configure。

      <table_type_definition>, ( { <column_definition> <column_constraint> ,   | <computed_column_definition> } ,   [ <table_constraint> ] [ ,...n ], ) ,

      定義 Transact-SQL 函數的表數據類型。表聲明包含列定義和列約束(或表約束)。表始終放在主文件組中。

      < clr_table_type_definition > , ( { column_name data_type } [ ,...n ] ),

      定義 CLR 函數的表數據類型。表聲明僅包含列名稱和數據類型。表始終放在主文件組中。

      <function_option>::= and <clr_function_option>::=

      指定函數將具有以下一個或多個選項:

      ENCRYPTION

      指示數據庫引擎 對包含 CREATE FUNCTION 語句文本的目錄視圖列進行加密。使用 ENCRYPTION 可以防止將函數作為 SQL Server 復制的一部分發布。不能為 CLR 函數指定 ENCRYPTION。

      SCHEMABINDING

      指定將函數綁定到其引用的數據庫對象。如果其他架構綁定對象也在引用該函數,此條件將防止對其進行更改。

      只有發生下列操作之一時,才會刪除函數與其引用對象的綁定:

      • 刪除函數。

      • 在未指定 SCHEMABINDING 選項的情況下,使用 ALTER 語句修改函數。

      只有滿足以下條件時,函數才能綁定到架構:

      • 函數為 Transact-SQL 函數。

      • 該函數引用的用戶定義函數和視圖也綁定到架構。

      • 該函數引用的對象是用由兩部分組成的名稱引用的。

      • 該函數及其引用的對象屬于同一數據庫。

      • 執行 CREATE FUNCTION 語句的用戶對該函數引用的數據庫對象具有 REFERENCES 權限。

      不能為 CLR 函數或引用別名數據類型的函數指定 SCHEMABINDING。

      RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT

      指定標量值函數的 OnNULLCall 屬性。如果未指定,則默認為 CALLED ON NULL INPUT。這意味著即使傳遞的參數為 NULL,也將執行函數體。

      如果在 CLR 函數中指定了 RETURNS NULL ON NULL INPUT,它指示當 SQL Server 接收到的任何一個參數為 NULL 時,它可以返回 NULL,而無需實際調用函數體。如果 <method_specifier> 中指定的 CLR 函數的方法已具有指示 RETURNS NULL ON NULL INPUT 的自定義屬性,但 CREATE FUNCTION 語句指示 CALLED ON NULL INPUT,則優先采用 CREATE FUNCTION 語句指示的屬性。不能為 CLR 表值函數指定 OnNULLCall 屬性。

      EXECUTE AS 子句

      指定用于執行用戶定義函數的安全上下文。所以,您可以控制 SQL Server 使用哪一個用戶帳戶來驗證針對該函數引用的任何數據庫對象的權限。

      注意:
      不能為內聯用戶定義函數指定 EXECUTE AS。

      有關詳細信息,請參閱EXECUTE AS 子句 (Transact-SQL)。

      < column_definition >::=

      定義表數據類型。表聲明包含列定義和約束。對于 CLR 函數,只能指定 column_name 和 data_type。

      column_name

      表中列的名稱。列名稱必須符合標識符規則,并且在表中必須是唯一的。column_name 可以由 1 至 128 個字符組成。

      data_type

      指定列數據類型。對于 Transact-SQL 函數,可以使用除 timestamp 之外的所有數據類型(包括 CLR 用戶定義類型)。對于 CLR 函數,可以使用除 text、ntext、image、char、varchar、varchar(max) 和 timestamp 之外的所有數據類型(包括 CLR 用戶定義類型)。在 Transact-SQL 或 CLR 函數中,非標量類型 cursor 不能指定為列數據類型。

      DEFAULT constant_expression

      指定當插入過程中沒有顯式提供值時為列提供的值。constant_expression 可以是常量、NULL 或系統函數值。DEFAULT 定義可以應用于除具有 IDENTITY 屬性的列之外的任何列。不能為 CLR 表值函數指定 DEFAULT。

      COLLATE collation_name

      指定列的排序規則。如果未指定,則為此列分配數據庫的默認排序規則。排序規則名稱既可以是 Windows 排序規則名稱,也可以是 SQL 排序規則名稱。有關排序規則的列表及詳細信息,請參閱 Windows 排序規則名稱 (Transact-SQL)SQL 排序規則名稱 (Transact-SQL)

      COLLATE 子句只能用來更改數據類型為 char、varchar、nchar 和 nvarchar 的列的排序規則。

      不能為 CLR 表值函數指定 COLLATE。

      ROWGUIDCOL

      指示新列是行的全局唯一標識符列。對于每個表,只能將其中的一個 uniqueidentifier 列指定為 ROWGUIDCOL 列。ROWGUIDCOL 屬性只能分配給 uniqueidentifier 列。

      ROWGUIDCOL 屬性并不強制實現列中存儲的值的唯一性。該屬性也不會為插入表的新行自動生成值。若要為每列生成唯一值,請在 INSERT 語句中使用 NEWID 函數。可以指定默認值;但是,不能將 NEWID 指定為默認值。

      IDENTITY

      指示新列是標識列。在為表添加新行時,SQL Server 將為該列提供唯一的增量值。標識列通常與 PRIMARY KEY 約束一起使用,作為表的唯一行標識符。可以將 IDENTITY 屬性分配給 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 列。每個表只能創建一個標識列。不能將綁定默認值和 DEFAULT 約束用于標識列。必須同時指定 seed 和 increment,或者二者都不指定。如果二者都未指定,則取默認值 (1,1)。

      不能為 CLR 表值函數指定 IDENTITY。

      seed

      要分配給表中第一行的整數值。

      increment

      要加到表中后續行的 seed 值上的整數值。

      < column_constraint >::= and < table_constraint>::=

      為指定列或表定義約束。對于 CLR 函數,允許的唯一約束類型為 NULL。不允許命名約束。

      NULL | NOT NULL

      確定列中是否允許空值。嚴格講來,NULL 不是約束,但可以像指定 NOT NULL 那樣指定它。不能為 CLR 表值函數指定 NOT NULL。

      PRIMARY KEY

      一個約束,該約束通過唯一索引來強制指定列的實體完整性。在表值用戶定義函數中,只能對每個表中的一列創建 PRIMARY KEY 約束。不能為 CLR 表值函數指定 PRIMARY KEY。

      UNIQUE

      一個約束,該約束通過唯一索引為一個或多個指定列提供實體完整性。一個表可以有多個 UNIQUE 約束。不能為 CLR 表值函數指定 UNIQUE。

      CLUSTERED | NONCLUSTERED

      指示為 PRIMARY KEY 或 UNIQUE 約束創建聚集索引還是非聚集索引。PRIMARY KEY 約束使用 CLUSTERED,而 UNIQUE 約束使用 NONCLUSTERED。

      只能為一個約束指定 CLUSTERED。如果為 UNIQUE 約束指定了 CLUSTERED,并且指定了 PRIMARY KEY 約束,則 PRIMARY KEY 使用 NONCLUSTERED。

      不能為 CLR 表值函數指定 CLUSTERED 和 NONCLUSTERED。

      CHECK

      一個約束,該約束通過限制可輸入一列或多列中的可能值來強制實現域完整性。不能為 CLR 表值函數指定 CHECK 約束。

      logical_expression

      返回 TRUE 或 FALSE 的邏輯表達式。

      <computed_column_definition>::=

      指定計算列。有關計算列的詳細信息,請參閱 CREATE TABLE (Transact-SQL)。

      column_name

      計算列的名稱。

      computed_column_expression

      定義計算列的值的表達式。

      <index_option>::=

      為 PRIMARY KEY 或 UNIQUE 索引指定索引選項。有關索引選項的詳細信息,請參閱 CREATE INDEX (Transact-SQL)。

      PAD_INDEX = { ON | OFF }

      指定索引填充。默認值為 OFF。

      FILLFACTOR = fillfactor

      指定一個百分比,指示在創建或更改索引期間,數據庫引擎 對各索引頁的葉級填充的程度。fillfactor 必須為介于 1 至 100 之間的整數值。默認值為 0。

      IGNORE_DUP_KEY = { ON | OFF }

      指定當對唯一聚集索引或唯一非聚集索引的多行插入事務中出現重復鍵值時的錯誤響應。默認值為 OFF。

      STATISTICS_NORECOMPUTE = { ON | OFF }

      指定是否重新計算分布統計信息。默認值為 OFF。

      ALLOW_ROW_LOCKS = { ON | OFF }

      指定是否允許行鎖。默認值為 ON。

      ALLOW_PAGE_LOCKS = { ON | OFF }

      指定是否允許頁鎖。默認值為 ON。

      權限

      需要在數據庫中具有 CREATE FUNCTION 權限,并對創建函數時所在的架構具有 ALTER 權限。如果函數指定用戶定義類型,則需要對該類型具有 EXECUTE 權限。

      示例

      A. 使用計算 ISO 周的標量值用戶定義函數

      以下示例將創建用戶定義函數 ISOweek。此函數使用日期參數來計算 ISO 周數。要使此函數能正確計算,必須在調用該函數前調用 SET DATEFIRST 1

      另外,該示例將顯示如何使用 EXECUTE AS 子句指定可在其中執行存儲過程的安全上下文。在該示例中,CALLER 選項指定該過程將在調用該過程的用戶的上下文中執行。您還可以指定 SELF、OWNER 和 user_name 等其他選項。有關詳細信息,請參閱EXECUTE AS 子句 (Transact-SQL)

      復制代碼
      USE AdventureWorks;
      GO
      IF OBJECT_ID (N'dbo.ISOweek', N'FN') IS NOT NULL
          DROP FUNCTION dbo.ISOweek;
      GO
      CREATE FUNCTION dbo.ISOweek (@DATE datetime)
      RETURNS int
      WITH EXECUTE AS CALLER
      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;
      GO

      下面是函數調用。請注意,DATEFIRST 設置為 1。

      復制代碼
      SET DATEFIRST 1;
      SELECT dbo.ISOweek(CONVERT(DATETIME,'12/26/2004',101)) AS 'ISO Week';

      下面是結果集: 

      復制代碼
      ISO Week
      ----------------
      52

      B. 創建內聯表值函數

      以下示例將返回內聯表值函數。對于銷售給商店的每個產品,該函數返回三列,分別為 ProductID、Name 以及各個商店年初至今總數的累計 YTD Total 。

      復制代碼
      USE AdventureWorks;
      GO
      IF OBJECT_ID (N'Sales.fn_SalesByStore', N'IF') IS NOT NULL
          DROP FUNCTION Sales.fn_SalesByStore;
      GO
      CREATE FUNCTION Sales.fn_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
      );
      GO

      若要調用該函數,請運行此查詢。

      復制代碼
      SELECT * FROM Sales.fn_SalesByStore (602);

      C. 創建多語句表值函數

      以下示例創建了表值函數 fn_FindReports(InEmpID)。如果提供一個有效雇員 ID,該函數將返回一個表,該表對應于直接或間接向該雇員報告的所有雇員。該函數使用遞歸公用表表達式 (CTE) 來生成雇員的層次結構列表。有關遞歸 CTE 的詳細信息,請參閱 WITH common_table_expression (Transact-SQL)。

      復制代碼
      USE AdventureWorks;
      GO
      IF OBJECT_ID (N'dbo.fn_FindReports', N'TF') IS NOT NULL
          DROP FUNCTION dbo.fn_FindReports;
      GO
      CREATE FUNCTION dbo.fn_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.fn_FindReports(109)
      ORDER BY Sort;

      D. 創建 CLR 函數

      以下示例假定在本地計算機的默認位置安裝了 SQL Server Database Engine samples,并且已編譯了 StringManipulate.csproj 示例應用程序。有關詳細信息,請參閱 能夠識別補充字符的字符串操作。

      該示例將創建 CLR 函數 len_s。在創建該函數之前,程序集 SurrogateStringFunction.dll 已在本地數據庫中注冊。

      復制代碼
      DECLARE @SamplesPath nvarchar(1024);
      -- You may have to modify the value of the this variable if you have
      --installed the sample someplace other than the default location.
      SELECT @SamplesPath = REPLACE(physical_name, 'Microsoft SQL Server/MSSQL.1/MSSQL/DATA/master.mdf', 'Microsoft SQL Server/90/Samples/Engine/Programmability/CLR/') 
          FROM master.sys.database_files 
          WHERE name = 'master';
      
      CREATE ASSEMBLY [SurrogateStringFunction]
      FROM @SamplesPath + 'StringManipulate/CS/StringManipulate/bin/debug/SurrogateStringFunction.dll'
      WITH PERMISSION_SET = EXTERNAL_ACCESS;
      GO
      
      CREATE FUNCTION [dbo].[len_s] (@str nvarchar(4000))
      RETURNS bigint
      AS EXTERNAL NAME [SurrogateStringFunction].[Microsoft.Samples.SqlServer.SurrogateStringFunction].[LenS];
      GO
      posted @ 2008-10-17 17:18  .NET快速開發框架  閱讀(1109)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久午夜色播影院| 免费看欧美日韩一区二区三区| 久久精品亚洲精品国产色婷| 日韩高清不卡免费一区二区| 中国CHINA体内裑精亚洲日本| 久久99精品久久久久久不卡| 国产又爽又黄又刺激的视频| 日韩国产精品无码一区二区三区| 国产精品久久久久久久久久| 国内自拍第一区二区三区| 中文字幕亚洲制服在线看| 狠狠躁夜夜躁人人爽蜜桃| 99精品久久毛片a片| 国产精品中文字幕二区| 亚洲熟妇色自偷自拍另类| 亚洲综合av永久无码精品一区二区| 亚洲欧美自偷自拍视频图片| 久久久久无码国产精品不卡| 国产丰满乱子伦午夜福利| 无套内射视频囯产| 国产精品成人99一区无码| 久久精品蜜芽亚洲国产AV| 精品久久精品午夜精品久久| 综合色久七七综合尤物| 青青青爽在线视频观看| 国产地址二永久伊甸园| 麻豆精品国产熟妇aⅴ一区| 亚洲成在人线在线播放无码| 高清中文字幕国产精品 | 亚洲熟妇自偷自拍另类| 色琪琪丁香婷婷综合久久| 午夜亚洲国产理论片亚洲2020| 成人拍拍拍无遮挡免费视频| 油尖旺区| 人妻少妇精品无码专区二区| 色噜噜久久综合伊人一本| 国产一二三五区不在卡| 日韩美av一区二区三区| 中文无码日韩欧免费视频| 精品熟女日韩中文十区| 亚洲综合精品一区二区三区|