熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

Sql2k中新增加的Function的sqlbook 的幫助

2022-06-13   來源: SQL Server 

  /*
   豆腐技術站
  */
  CREATE FUNCTION
  創建用戶定義函數它是返回值的已保存的 TransactSQL 例程用戶定義函數不能用於執行一組修改全局數據庫狀態的
  操作與系統函數一樣用戶定義函數可以從查詢中喚醒調用也可以像存儲過程一樣通過 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 [ ( ] selectstmt [ ) ]
  
  多語句表值函數
  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 語句中可以聲明一個或多個參數函數最多可以有 個參數函數執行時每個已聲明參數的值必須由用戶指定除非該參數的默認值已經定義 如果函數的參數有默認值在調用該函數時必須指定default關鍵字才能獲得默認值這種行為不同於存儲過程中有默認值的參數在存儲過程中省略參數也意味著使用默認值
  
  使用 @ 符號作為第一個字符來指定參數名稱參數名稱必須符合標識符的規則每個函數的參數僅用於該函數本身相同的參數名稱可以用在其它函數中參數只能代替常量而不能用於代替表名列名或其它數據庫對象的名稱
  
  scalar_parameter_data_type
  
  參數的數據類型所有標量數據類型(包括 bigint 和 sql_variant)都可用作用戶定義函數的參數不支持 timestamp數據類型和用戶定義數據類型不能指定非標量類型(例如 cursor 和 table)
  
  scalar_return_data_type
  
  是標量用戶定義函數的返回值scalar_return_data_type 可以是 SQL Server 支持的任何標量數據類型(textntextimage 和 timestamp 除外)
  
  scalar_expression
  
  指定標量函數返回的標量值
  
  TABLE
  
  指定表值函數的返回值為表
  
  在內嵌表值函數中通過單個 SELECT 語句定義 TABLE 返回值內嵌函數沒有相關聯的返回變量
  
  在多語句表值函數中@return_variable 是 TABLE 變量用於存儲和累積應作為函數值返回的行
  
  function_body
  
  指定一系列 TransactSQL 語句定義函數的值這些語句合在一起不會產生副作用function_body 只用於標量函數和多語句表值函數
  
  在標量函數中function_body 是一系列合起來求得標量值的 TransactSQL 語句
  
  在多語句表值函數中function_body 是一系列填充表返回變量的 TransactSQL 語句
  
  selectstmt
  
  是定義內嵌表值函數返回值的單個 SELECT 語句
  
  ENCRYPTION
  
  指出 SQL Server 加密包含 CREATE FUNCTION 語句文本的系統表列使用 ENCRYPTION 可以避免將函數作為 SQL Server復制的一部分發布
  
  SCHEMABINDING
  
  指定將函數綁定到它所引用的數據庫對象如果函數是用 SCHEMABINDING 選項創建的則不能更改(使用 ALTER 語句)或除去(使用 DROP 語句)該函數引用的數據庫對象
  
  函數與其所引用對象的綁定關系只有在發生以下兩種情況之一時才被解除
  
  除去了函數
  
  在未指定 SCHEMABINDING 選項的情況下更改了函數(使用 ALTER 語句)
  
  只有在滿足以下條件時函數才能綁定到架構
  
  該函數所引用的用戶定義函數和視圖也已綁定到架構
  
  該函數所引用的對象不是用兩部分名稱引用的
  
  該函數及其引用的對象屬於同一數據庫
  
  執行 CREATE FUNCTION 語句的用戶對所有該函數所引用的數據庫對象都具有 REFERENCES 權限
  
  如果不符合以上條件則指定了 SCHEMABINDING 選項的 CREATE FUNCTION 語句將失敗
  
  注釋
  用戶定義函數為標量值函數或表值函數如果 RETURNS 子句指定一種標量數據類型則函數為標量值函數可以使用多條 TransactSQL 語句定義標量值函數
  
  如果 RETURNS 子句指定 TABLE則函數為表值函數根據函數主體的定義方式表值函數可分為行內函數或多語句函數
  
  如果 RETURNS 子句指定的 TABLE 不附帶列的列表則該函數為行內函數行內函數是使用單個 SELECT 語句定義的表值函數該語句組成了函數的主體該函數返回的表的列(包括數據類型)來自定義該函數的 SELECT 語句的 SELECT 列表
  
  如果 RETURNS 子句指定的 TABLE 類型帶有列及其數據類型則該函數是多語句表值函數
  
  多語句函數的主體中允許使用以下語句未在下面的列表中列出的語句不能用在函數主體中
  
  賦值語句
  
  控制流語句
  
  DECLARE 語句該語句定義函數局部的數據變量和游標
  
  SELECT 語句該語句包含帶有表達式的選擇列表其中的表達式將值賦予函數的局部變量
  
  游標操作該操作引用在函數中聲明打開關閉和釋放的局部游標只允許使用以 INTO 子句向局部變量賦值的 FETCH語句不允許使用將數據返回到客戶端的 FETCH 語句
  
  INSERTUPDATE 和 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? SQL Server?但是它不應嘗試聯接與喚醒調用擴展存儲過程的函數相同的事務
  
  與從批處理或存儲過程中喚醒調用相似擴展存儲過程在運行 SQL Server 的 Windows? 安全帳戶的上下文中執行存儲過程的所有者在授予用戶 EXECUTE 特權時應考慮這一點
  
  函數調用
  在可使用標量表達式的位置可喚醒調用標量值函數包括計算列和 CHECK 約束定義當喚醒調用標量值函數時至少應使用函數的兩部分名稱
  
  [database_name]owner_namefunction_name ([argument_expr][])
  
  如果用戶定義函數用於定義計算列則該函數的確定性同樣決定了是否可在該計算列上創建索引只有當函數具有確定性時才可以在使用該函數的計算列上創建索引如果在輸入相同的情況下函數始終返回相同的值則該函數具有確定性
  
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22217.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.