創建用戶定義函數。這是一個已保存 Transact-SQL 或公共語言運行時 (CLR) 例程,該例程可返回一個值。用戶定義函數不能用于執行修改數據庫狀態的操作。與系統函數一樣,用戶定義函數可從查詢中調用。標量函數和存儲過程一樣,可使用 EXECUTE 語句執行。
用戶定義函數可使用 ALTER FUNCTION 修改,使用 DROP FUNCTION 刪除。
語法
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 } } |
備注
<content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">用戶定義函數為標量值函數或表值函數。如果 RETURNS 子句指定了一種標量數據類型,則函數為標量值函數。可以使用多條 Transact-SQL 語句定義標量值函數。</p> <p xmlns="">如果 RETURNS 子句指定 TABLE,則函數為表值函數。根據函數主體的定義方式,表值函數可分為內聯函數或多語句函數。有關詳細信息,請參閱<?XML:NAMESPACE PREFIX = MSHelp NS = "http://msdn.microsoft.com/mshelp" /><link tabindex="0" keywords="df3a6606-3312-440c-8d6d-2d28575112ed">。</p> <p xmlns="">下列語句在函數內有效: </p> <ul xmlns=""> <li>賦值語句。<br><br> </li> <li>TRY...CATCH 語句以外的流控制語句。<br><br> </li> <li>定義局部數據變量和局部游標的 DECLARE 語句。<br><br> </li> <li>SELECT 語句,其中的選擇列表包含為局部變量分配值的表達式。<br><br> </li> <li>游標操作,該操作引用在函數中聲明、打開、關閉和釋放的局部游標。只允許使用以 INTO 子句向局部變量賦值的 FETCH 語句;不允許使用將數據返回到客戶端的 FETCH 語句。<br><br> </li> <li>修改 table 局部變量的 INSERT、UPDATE 和 DELETE 語句。<br><br> </li> <li>調用擴展存儲過程的 EXECUTE 語句。<br><br> </li> <li>有關詳細信息,請參閱<link tabindex="0" keywords="f0d5dd10-73fd-4e05-9177-07f56552bdf7">。<br><br> </li> </ul></content><sections xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><h3 class="subHeading" xmlns="">嵌套用戶定義函數</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">用戶定義函數可以嵌套;也就是說,用戶定義函數可相互調用。被調用函數開始執行時,嵌套級別將增加;被調用函數執行結束后,嵌套級別將減少。用戶定義函數的嵌套級別最多可達 32 級。如果超出最大嵌套級別數,整個調用函數鏈將失敗。 </p> <div class="alert" xmlns=""> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr><th align="left"> <img class="note" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/note.gif">注意: </th></tr> <tr><td>從 Transact-SQL 用戶定義函數對托管代碼的任何引用都將計入 32 級嵌套限制的一個級別。從托管代碼內部調用的方法不根據此限制進行計數。 <p></p> </td></tr> </tbody></table> <p></p> </div></content></div> <h3 class="subHeading" xmlns="">函數屬性</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">在 SQL Server 的早期版本中,函數只能分為確定性函數和不確定性函數兩類。在 SQL Server 2005 中,函數具有下列屬性。這些屬性的值確定了函數是否可用于持久化計算列或索引計算列。</p> <h3 class="subHeading" xmlns=""></h3> <table style="BACKGROUND-COLOR: #cccccc" cellspacing="0" cellpadding="0" width="100%" border="1" xmlns=""><tbody> <tr> <th>屬性 </th> <th>說明 </th> <th>注意 </th> </tr> <tr> <td> <p>IsDeterministic </p> </td> <td> <p>函數是確定性函數還是不確定性函數。</p> </td> <td> <p>確定性函數中允許本地數據訪問。例如,如果每次使用一組特定輸入值和相同數據庫狀態調用函數時,函數都返回相同結果,則該函數將被標記為確定性函數。</p> </td> </tr> <tr> <td> <p>IsPrecise </p> </td> <td> <p>函數是精確函數還是不精確函數。</p> </td> <td> <p>不精確函數包含浮點運算之類的運算。</p> </td> </tr> <tr> <td> <p>IsSystemVerified </p> </td> <td> <p>SQL Server 可驗證函數的精度和確定性屬性。</p> </td> <td> <p></p> </td> </tr> <tr> <td> <p>SystemDataAccess </p> </td> <td> <p>函數可以訪問 SQL Server 的本地實例中的系統數據(系統目錄或虛擬系統表)。</p> </td> <td> <p></p> </td> </tr> <tr> <td> <p>UserDataAccess </p> </td> <td> <p>函數可以訪問 SQL Server 的本地實例中的用戶數據。</p> </td> <td> <p>包含用戶定義表和臨時表,但不包含表變量。</p> </td> </tr> </tbody></table> <p xmlns="">Transact-SQL 函數的精度和確定性屬性由 SQL Server 自動確定。有關詳細信息,請參閱<link tabindex="0" keywords="58e95e8f-39be-4290-94c8-2f1afce25615">。CLR 函數的數據訪問權限和確定性屬性可由用戶指定。有關詳細信息,請參閱 <link tabindex="0" keywords="ecf5c097-0972-48e2-a9c0-b695b7dd2820">。</p> <p xmlns="">若要顯示這些屬性的當前值,請使用 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/be36b3e3-3309-4332-bfb5-c7e9cf8dc8bd.htm"><u><font color="#0000ff">OBJECTPROPERTYEX</font></u></a>。 </p></content></div> <h3 class="subHeading" xmlns="">對調用用戶定義函數的計算列進行索引</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">如果用戶定義函數具有下列屬性值,則可以在索引中使用調用用戶定義函數的計算列: </p> <ul xmlns=""> <li>IsDeterministic = true<br><br> </li> <li>IsSystemVerified = true(計算列是持久性計算列時除外)<br><br> </li> <li>UserDataAccess = false<br><br> </li> <li>SystemDataAccess = false<br><br> </li> </ul> <p xmlns="">有關詳細信息,請參閱<link tabindex="0" keywords="8d17ac9c-f3af-4bbb-9cc1-5cf647e994c4">。</p></content></div> <h3 class="subHeading" xmlns="">從函數中調用擴展存儲過程</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">如果在函數中調用擴展存儲過程,則該過程不能向客戶端返回結果集。向客戶端返回結果集的任何 ODS API 都將返回 FAIL。擴展存儲過程可以連接回 SQL Server 的實例;不過,該過程不應嘗試與調用擴展存儲過程的函數同時聯接到同一事務。</p> <p xmlns="">與通過批處理或存儲過程進行調用相似,擴展存儲過程在運行 SQL Server 的 Windows 安全帳戶的上下文中執行。存儲過程的所有者在授予用戶 EXECUTE 權限時應考慮這一點。</p></content></div> <h3 class="subHeading" xmlns="">函數調用</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">可在使用標量表達式的位置調用標量值函數。這包括計算列和 CHECK 約束定義。也可以使用 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/bc806b71-cc55-470a-913e-c5f761d5c4b7.htm"><u><font color="#0000ff">EXECUTE</font></u></a> 語句執行標量值函數。在允許表表達式的情況下,可在 SELECT、INSERT、UPDATE 或 DELETE 語句的 FROM 子句中調用表值函數。有關詳細信息,請參閱<link tabindex="0" keywords="0de7744d-9b73-463f-ae80-e31a020004b5">。</p></content></div> <h3 class="subHeading" xmlns="">在 CLR 函數中使用參數和返回值</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">如果在 CLR 函數中指定了參數,則這些參數應為 SQL Server 類型,即以前為 scalar_parameter_data_type 定義的類型。有關將 SQL Server 系統數據類型與 CLR 集成數據類型或 .NET Framework 公共語言運行時數據類型進行比較的信息,請參閱 <link tabindex="0" keywords="89b43ee9-b9ad-4281-a4bf-c7c8d116daa2">。 </p> <p xmlns="">為了使 SQL Server 在類中重載時引用正確方法,<method_specifier> 中指示的方法必須具有下列特征: </p> <ul xmlns=""> <li>接收 [ ,...n ] 中指定的參數數量。<br><br> </li> <li>通過值而不是引用來接收所有參數。<br><br> </li> <li>使用與 SQL Server 函數中指定的類型兼容的參數類型。<br><br> </li> </ul> <p xmlns="">如果 CLR 函數的返回數據類型指定表類型 (RETURNS TABLE),則 <method_specifier> 中方法的返回數據類型應為 IEnumerator 或 IEnumerable 類型,且假定由函數創建者來實現接口。與 Transact-SQL 函數不同,CLR 函數不能在 <table_type_definition> 中包含 PRIMARY KEY、UNIQUE 或 CHECK 約束。 <table_type_definition> 中指定的列的數據類型,必須與 <method_specifier> 中的方法在執行時返回的結果集中的對應列的類型匹配。創建函數時不執行上述類型檢查。</p> <p xmlns="">有關對 CLR 函數編程的詳細信息,請參閱 <link tabindex="0" keywords="6f7491f1-9a46-4146-ae09-056248634de2">。</p></content></div> <h3 class="subHeading" xmlns="">不允許的 SQL 語句</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">下列 Service Broker 語句不能包含在 Transact-SQL 用戶定義函數的定義中: </p> <ul xmlns=""> <li>BEGIN DIALOG CONVERSATION<br><br> </li> <li>END CONVERSATION<br><br> </li> <li>GET CONVERSATION GROUP<br><br> </li> <li>MOVE CONVERSATION<br><br> </li> <li>RECEIVE<br><br> </li> <li>SEND<br><br> </li> </ul></content></div> <h3 class="subHeading" xmlns="">查看有關函數的信息</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">若要顯示 Transact-SQL 用戶定義函數的定義,請使用函數所在數據庫中的 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/23d3ccd2-f356-4d89-a2cd-bee381243f99.htm"><u><font color="#0000ff">sys.sql_modules</font></u></a> 目錄視圖。 </p> <p xmlns="">例如:</p> <div class="code" xmlns=""><span codelanguage="other"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr> <th align="left"></th> <th align="right"><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" style="CURSOR: default" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/copycode.gif" align="absMiddle" name="ccImage">復制代碼</span></th> </tr> <tr><td colspan="2"><pre>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</pre></td></tr> </tbody></table></span></div> <div class="alert" xmlns=""> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr><th align="left"> <img class="note" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/note.gif">注意: </th></tr> <tr><td>不能使用 sys.sql_modules 查看使用 ENCRYPTION 選項創建的函數定義;不過,可顯示有關加密函數的其他信息。 <p></p> </td></tr> </tbody></table> <p></p> </div> <p xmlns="">若要顯示有關 CLR 用戶定義函數的信息,請使用函數所在數據庫中的 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/5f9e644e-8065-49a2-b53d-db7df98f70d8.htm"><u><font color="#0000ff">sys.assembly_modules</font></u></a> 目錄視圖。</p> <p xmlns="">若要顯示有關用戶定義函數中定義的參數的信息,請使用函數所在數據庫中的 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/24e2764b-c8e5-4322-97a4-7407d8b8a92b.htm"><u><font color="#0000ff">sys.parameters</font></u></a> 目錄視圖。</p> <p xmlns="">若要顯示有關函數引用的對象的報表,請使用 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/1779aa87-a0b8-470a-a286-d7cc0b93ad2e.htm"><u><font color="#0000ff">sys.sql_dependencies</font></u></a>。 </p></content></div></sections>
參數
<content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><dl xmlns=""> <dt>schema_name </dt> <dd> <p>用戶定義函數所屬的架構的名稱。</p> </dd> </dl> <dl xmlns=""> <dt>function_name </dt> <dd> <p>用戶定義函數的名稱。函數名稱必須符合有關<link tabindex="0" keywords="171291bb-f57f-4ad1-8cea-0b092d5d150c">的規則,并且在數據庫中以及對其架構來說是唯一的。</p> <div class="alert"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr><th align="left"> <img class="note" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/note.gif">注意: </th></tr> <tr><td>即使未指定參數,函數名稱后也需要加上括號。 <p></p> </td></tr> </tbody></table> <p></p> </div> </dd> </dl> <dl xmlns=""> <dt>@parameter_name </dt> <dd> <p>用戶定義函數的參數。可聲明一個或多個參數。 </p> <p>函數最多可以有 1,024 個參數。執行函數時,如果未定義參數的默認值,則用戶必須提供每個已聲明參數的值。 </p> <p>通過將 at 符號 (@) 用作第一個字符來指定參數名稱。參數名稱必須符合有關標識符的規則。參數是對應于函數的局部參數;其他函數中可使用相同的參數名稱。參數只能代替常量,而不能用于代替表名、列名或其他數據庫對象的名稱。 </p> <div class="alert"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr><th align="left"> <img class="note" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/note.gif">注意: </th></tr> <tr><td>在存儲過程或用戶定義函數中傳遞參數時,或在批語句中聲明和設置變量時,不會遵守 ANSI_WARNINGS。例如,如果將變量定義為 char(3) 類型,然后將其值設置為多于三個字符,則數據將截斷為定義大小,并且 INSERT 或 UPDATE 語句可以成功執行。 <p></p> </td></tr> </tbody></table> <p></p> </div> </dd> </dl> <dl xmlns=""> <dt>[ type_schema_name. ] parameter_data_type </dt> <dd> <p>參數的數據類型及其所屬的架構,后者為可選項。對于 Transact-SQL 函數,可以使用除 timestamp 數據類型之外的所有數據類型(包括 CLR 用戶定義類型)。對于 CLR 函數,可以使用除 text、ntext、image 和 timestamp 數據類型之外的所有數據類型(包括 CLR 用戶定義類型)。不能將非標量類型 cursor 和 table 指定為 Transact-SQL 函數或 CLR 函數中的參數數據類型。</p> <p>如果未指定 type_schema_name,則 SQL Server 2005 Database Engine將按以下順序查找 scalar_parameter_data_type:</p> <ul> <li>包含 SQL Server 系統數據類型名稱的架構。<br><br> </li> <li>當前數據庫中當前用戶的默認架構。<br><br> </li> <li>當前數據庫中的 dbo 架構。<br><br> </li> </ul> </dd> </dl> <dl xmlns=""> <dt>[ = default ] </dt> <dd> <p>參數的默認值。如果定義了 default 值,則無需指定此參數的值即可執行函數。 </p> <div class="alert"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr><th align="left"> <img class="note" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/note.gif">注意: </th></tr> <tr><td>可以為除 varchar(max) 和 varbinary(max) 數據類型之外的 CLR 函數指定默認參數值。 <p></p> </td></tr> </tbody></table> <p></p> </div> <p>如果函數的參數有默認值,則該函數檢索默認值時必須指定 DEFAULT 關鍵字。此行為與在存儲過程中使用具有默認值的參數不同,在后一種情況下,不提供參數同樣意味著使用默認值。</p> </dd> </dl> <dl xmlns=""> <dt>return_data_type </dt> <dd> <p>標量用戶定義函數的返回值。對于 Transact-SQL 函數,可以使用除 timestamp 數據類型之外的所有數據類型(包括 CLR 用戶定義類型)。對于 CLR 函數,可以使用除 text、ntext、image 和 timestamp 數據類型之外的所有數據類型(包括 CLR 用戶定義類型)。不能將非標量類型 cursor 和 table 指定為 Transact-SQL 函數或 CLR 函數中的返回數據類型。 </p> </dd> </dl> <dl xmlns=""> <dt>function_body </dt> <dd> <p>指定一系列定義函數值的 Transact-SQL 語句,這些語句在一起使用不會產生負面影響(例如修改表)。function_body 僅用于標量函數和多語句表值函數。</p> <p>在標量函數中,function_body 是一系列 Transact-SQL 語句,這些語句一起使用的計算結果為標量值。 </p> <p>在多語句表值函數中,function_body 是一系列 Transact-SQL 語句,這些語句將填充 TABLE 返回變量。 </p> </dd> </dl> <dl xmlns=""> <dt>scalar_expression </dt> <dd> <p>指定標量函數返回的標量值。</p> </dd> </dl> <dl xmlns=""> <dt>TABLE </dt> <dd> <p>指定表值函數的返回值為表。只有常量和 @local_variables 可以傳遞到表值函數。</p> <p>在內聯表值函數中,TABLE 返回值是通過單個 SELECT 語句定義的。內聯函數沒有關聯的返回變量。 </p> <p>在多語句表值函數中,@return_variable 是 TABLE 變量,用于存儲和匯總應作為函數值返回的行。只能將 @return_variable 指定用于 Transact-SQL 函數,而不能用于 CLR 函數。 </p> </dd> </dl> <dl xmlns=""> <dt>select_stmt </dt> <dd> <p>定義內聯表值函數的返回值的單個 SELECT 語句。</p> </dd> </dl> <dl xmlns=""> <dt>EXTERNAL NAME <method_specifier>, assembly_name.class_name.method_name </dt> <dd> <p>指定將程序集與函數綁定的方法。assembly_name 必須與 SQL Server 中當前數據庫內具有可見性的現有程序集匹配。class_name 必須是有效的 SQL Server 標識符,并且必須作為類存在于程序集中。如果類具有以命名空間限定的名稱,該名稱使用句點 (.) 來分隔命名空間的各部分,則必須使用方括號 ([ ]) 或引號 (" ") 分隔類名稱。method_name 必須是有效的 SQL Server 標識符,并且必須作為靜態方法存在于指定類中。</p> <div class="alert"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr><th align="left"> <img class="note" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/note.gif">注意: </th></tr> <tr><td>默認情況下,SQL Server 不能執行 CLR 代碼。可以創建、修改和刪除引用公共語言運行時模塊的數據庫對象;不過,只有在啟用 <link tabindex="0" xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5" keywords="0722d382-8fd3-4fac-b4a8-cd2b7a7e0293">之后,才能在 SQL Server 中執行這些引用。若要啟用此選項,請使用 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/d18b251d-b37a-4f5f-b50c-502d689594c8.htm"><u><font color="#0000ff">sp_configure</font></u></a>。 <p></p> </td></tr> </tbody></table> <p></p> </div> </dd> </dl> <dl xmlns=""> <dt><table_type_definition>, ( { <column_definition> <column_constraint> , | <computed_column_definition> } , [ <table_constraint> ] [ ,...n ], ) , </dt> <dd> <p>定義 Transact-SQL 函數的表數據類型。表聲明包含列定義和列約束(或表約束)。表始終放在主文件組中。</p> </dd> </dl> <dl xmlns=""> <dt>< clr_table_type_definition > , ( { column_name data_type } [ ,...n ] ), </dt> <dd> <p>定義 CLR 函數的表數據類型。表聲明僅包含列名稱和數據類型。表始終放在主文件組中。</p> </dd> </dl></content><sections xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><div class="subSection" xmlns=""> <content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"></content><sections xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><div class="subSection" xmlns=""> <content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"></content><sections xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><div class="subSection" xmlns=""> <content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"></content><sections xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><div class="subSection" xmlns=""> <content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"></content><sections xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns=""><function_option>::= and <clr_function_option>::=</p> <p xmlns="">指定函數將具有以下一個或多個選項:</p> <dl xmlns=""> <dt>ENCRYPTION </dt> <dd> <p>指示數據庫引擎對包含 CREATE FUNCTION 語句文本的目錄視圖列進行加密。使用 ENCRYPTION 可以防止將函數作為 SQL Server 復制的一部分發布。不能為 CLR 函數指定 ENCRYPTION。</p> </dd> </dl> <dl xmlns=""> <dt>SCHEMABINDING </dt> <dd> <p>指定將函數綁定到其引用的數據庫對象。如果其他架構綁定對象也在引用該函數,此條件將防止對其進行更改。</p> <p>只有發生下列操作之一時,才會刪除函數與其引用對象的綁定: </p> <ul> <li>刪除函數。<br><br> </li> <li>在未指定 SCHEMABINDING 選項的情況下,使用 ALTER 語句修改函數。<br><br> </li> </ul> <p>只有滿足以下條件時,函數才能綁定到架構: </p> <ul> <li>函數為 Transact-SQL 函數。<br><br> </li> <li>該函數引用的用戶定義函數和視圖也綁定到架構。<br><br> </li> <li>該函數引用的對象是用由兩部分組成的名稱引用的。<br><br> </li> <li>該函數及其引用的對象屬于同一數據庫。<br><br> </li> <li>執行 CREATE FUNCTION 語句的用戶對該函數引用的數據庫對象具有 REFERENCES 權限。<br><br> </li> </ul> <p>不能為 CLR 函數或引用別名數據類型的函數指定 SCHEMABINDING。 </p> </dd> </dl> <dl xmlns=""> <dt>RETURNS NULL ON NULL INPUT | <u>CALLED ON NULL INPUT</u> </dt> <dd> <p>指定標量值函數的 OnNULLCall 屬性。如果未指定,則默認為 CALLED ON NULL INPUT。這意味著即使傳遞的參數為 NULL,也將執行函數體。 </p> <p>如果在 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 屬性。 </p> </dd> </dl> <dl xmlns=""> <dt>EXECUTE AS 子句 </dt> <dd> <p>指定用于執行用戶定義函數的安全上下文。所以,您可以控制 SQL Server 使用哪一個用戶帳戶來驗證針對該函數引用的任何數據庫對象的權限。</p> <div class="alert"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr><th align="left"> <img class="note" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/note.gif">注意: </th></tr> <tr><td>不能為內聯用戶定義函數指定 EXECUTE AS。 <p></p> </td></tr> </tbody></table> <p></p> </div> <p>有關詳細信息,請參閱<a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/bd517aa3-f06e-4356-87d8-70de5df4494a.htm"><u><font color="#0000ff">EXECUTE AS 子句 (Transact-SQL)</font></u></a>。 </p> </dd> </dl></content></div> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">< column_definition >::=</p> <p xmlns="">定義表數據類型。表聲明包含列定義和約束。對于 CLR 函數,只能指定 column_name 和 data_type。</p> <dl xmlns=""> <dt>column_name </dt> <dd> <p>表中列的名稱。列名稱必須符合標識符規則,并且在表中必須是唯一的。column_name 可以由 1 至 128 個字符組成。</p> </dd> </dl> <dl xmlns=""> <dt>data_type </dt> <dd> <p>指定列數據類型。對于 Transact-SQL 函數,可以使用除 timestamp 之外的所有數據類型(包括 CLR 用戶定義類型)。對于 CLR 函數,可以使用除 text、ntext、image、char、varchar、varchar(max) 和 timestamp 之外的所有數據類型(包括 CLR 用戶定義類型)。在 Transact-SQL 或 CLR 函數中,非標量類型 cursor 不能指定為列數據類型。</p> </dd> </dl> <dl xmlns=""> <dt>DEFAULT constant_expression </dt> <dd> <p>指定當插入過程中沒有顯式提供值時為列提供的值。constant_expression 可以是常量、NULL 或系統函數值。DEFAULT 定義可以應用于除具有 IDENTITY 屬性的列之外的任何列。不能為 CLR 表值函數指定 DEFAULT。</p> </dd> </dl> <dl xmlns=""> <dt>COLLATE collation_name </dt> <dd> <p>指定列的排序規則。如果未指定,則為此列分配數據庫的默認排序規則。排序規則名稱既可以是 Windows 排序規則名稱,也可以是 SQL 排序規則名稱。有關排序規則的列表及詳細信息,請參閱 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/acceef84-2c68-46e2-a021-be019b7ab14e.htm"><u><font color="#0000ff">Windows 排序規則名稱 (Transact-SQL)</font></u></a>和 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/56483d24-add7-483d-9b96-c6fda460ddbc.htm"><u><font color="#0000ff">SQL 排序規則名稱 (Transact-SQL)</font></u></a>。</p> <p>COLLATE 子句只能用來更改數據類型為 char、varchar、nchar 和 nvarchar 的列的排序規則。 </p> <p>不能為 CLR 表值函數指定 COLLATE。</p> </dd> </dl> <dl xmlns=""> <dt>ROWGUIDCOL </dt> <dd> <p>指示新列是行的全局唯一標識符列。對于每個表,只能將其中的一個 uniqueidentifier 列指定為 ROWGUIDCOL 列。ROWGUIDCOL 屬性只能分配給 uniqueidentifier 列。 </p> <p>ROWGUIDCOL 屬性并不強制實現列中存儲的值的唯一性。該屬性也不會為插入表的新行自動生成值。若要為每列生成唯一值,請在 INSERT 語句中使用 NEWID 函數。可以指定默認值;但是,不能將 NEWID 指定為默認值。 </p> </dd> </dl> <dl xmlns=""> <dt>IDENTITY </dt> <dd> <p>指示新列是標識列。在為表添加新行時,SQL Server 將為該列提供唯一的增量值。標識列通常與 PRIMARY KEY 約束一起使用,作為表的唯一行標識符。可以將 IDENTITY 屬性分配給 tinyint、smallint、int、bigint、decimal(p,0) 或 numeric(p,0) 列。每個表只能創建一個標識列。不能將綁定默認值和 DEFAULT 約束用于標識列。必須同時指定 seed 和 increment,或者二者都不指定。如果二者都未指定,則取默認值 (1,1)。</p> <p>不能為 CLR 表值函數指定 IDENTITY。</p> <dl> <dt>seed </dt> <dd> <p>要分配給表中第一行的整數值。</p> </dd> </dl> <dl> <dt>increment </dt> <dd> <p>要加到表中后續行的 seed 值上的整數值。</p> </dd> </dl> </dd> </dl></content></div> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">< column_constraint >::= and < table_constraint>::=</p> <p xmlns="">為指定列或表定義約束。對于 CLR 函數,允許的唯一約束類型為 NULL。不允許命名約束。</p> <dl xmlns=""> <dt>NULL | NOT NULL </dt> <dd> <p>確定列中是否允許空值。嚴格講來,NULL 不是約束,但可以像指定 NOT NULL 那樣指定它。不能為 CLR 表值函數指定 NOT NULL。</p> </dd> </dl> <dl xmlns=""> <dt>PRIMARY KEY </dt> <dd> <p>一個約束,該約束通過唯一索引來強制指定列的實體完整性。在表值用戶定義函數中,只能對每個表中的一列創建 PRIMARY KEY 約束。不能為 CLR 表值函數指定 PRIMARY KEY。</p> </dd> </dl> <dl xmlns=""> <dt>UNIQUE </dt> <dd> <p>一個約束,該約束通過唯一索引為一個或多個指定列提供實體完整性。一個表可以有多個 UNIQUE 約束。不能為 CLR 表值函數指定 UNIQUE。</p> </dd> </dl> <dl xmlns=""> <dt>CLUSTERED | NONCLUSTERED </dt> <dd> <p>指示為 PRIMARY KEY 或 UNIQUE 約束創建聚集索引還是非聚集索引。PRIMARY KEY 約束使用 CLUSTERED,而 UNIQUE 約束使用 NONCLUSTERED。</p> <p>只能為一個約束指定 CLUSTERED。如果為 UNIQUE 約束指定了 CLUSTERED,并且指定了 PRIMARY KEY 約束,則 PRIMARY KEY 使用 NONCLUSTERED。</p> <p>不能為 CLR 表值函數指定 CLUSTERED 和 NONCLUSTERED。 </p> </dd> </dl> <dl xmlns=""> <dt>CHECK </dt> <dd> <p>一個約束,該約束通過限制可輸入一列或多列中的可能值來強制實現域完整性。不能為 CLR 表值函數指定 CHECK 約束。</p> <dl> <dt>logical_expression </dt> <dd> <p>返回 TRUE 或 FALSE 的邏輯表達式。</p> </dd> </dl> </dd> </dl></content></div> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns=""><computed_column_definition>::=</p> <p xmlns="">指定計算列。有關計算列的詳細信息,請參閱 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/1e068443-b9ea-486a-804f-ce7b6e048e8b.htm"><u><font color="#0000ff">CREATE TABLE (Transact-SQL)</font></u></a>。</p> <dl xmlns=""> <dt>column_name </dt> <dd> <p>計算列的名稱。</p> </dd> </dl> <dl xmlns=""> <dt>computed_column_expression </dt> <dd> <p>定義計算列的值的表達式。</p> </dd> </dl></content></div> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns=""><index_option>::=</p> <p xmlns="">為 PRIMARY KEY 或 UNIQUE 索引指定索引選項。有關索引選項的詳細信息,請參閱 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/d2297805-412b-47b5-aeeb-53388349a5b9.htm"><u><font color="#0000ff">CREATE INDEX (Transact-SQL)</font></u></a>。 </p> <dl xmlns=""> <dt>PAD_INDEX = { ON | <u>OFF</u> } </dt> <dd> <p>指定索引填充。默認值為 OFF。 </p> </dd> </dl> <dl xmlns=""> <dt>FILLFACTOR = fillfactor </dt> <dd> <p>指定一個百分比,指示在創建或更改索引期間,數據庫引擎對各索引頁的葉級填充的程度。fillfactor 必須為介于 1 至 100 之間的整數值。默認值為 0。 </p> </dd> </dl> <dl xmlns=""> <dt>IGNORE_DUP_KEY = { ON | <u>OFF</u> } </dt> <dd> <p>指定當對唯一聚集索引或唯一非聚集索引的多行插入事務中出現重復鍵值時的錯誤響應。默認值為 OFF。</p> </dd> </dl> <dl xmlns=""> <dt>STATISTICS_NORECOMPUTE = { ON | <u>OFF</u> } </dt> <dd> <p>指定是否重新計算分布統計信息。默認值為 OFF。</p> </dd> </dl> <dl xmlns=""> <dt>ALLOW_ROW_LOCKS = { <u>ON</u> | OFF } </dt> <dd> <p>指定是否允許行鎖。默認值為 ON。</p> </dd> </dl> <dl xmlns=""> <dt>ALLOW_PAGE_LOCKS = { <u>ON</u> | OFF } </dt> <dd> <p>指定是否允許頁鎖。默認值為 ON。</p> </dd> </dl></content></div></sections> </div></sections> </div></sections> </div></sections> </div></sections>
權限
<content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">需要在數據庫中具有 CREATE FUNCTION 權限,并對創建函數時所在的架構具有 ALTER 權限。如果函數指定用戶定義類型,則需要對該類型具有 EXECUTE 權限。</p></content>
示例
<content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"></content><sections xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><h3 class="subHeading" xmlns="">A. 使用計算 ISO 周的標量值用戶定義函數</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">以下示例將創建用戶定義函數 <code>ISOweek</code>。此函數使用日期參數來計算 ISO 周數。要使此函數能正確計算,必須在調用該函數前調用 <code>SET DATEFIRST 1</code>。 </p> <p xmlns="">另外,該示例將顯示如何使用 <code>EXECUTE AS</code> 子句指定可在其中執行存儲過程的安全上下文。在該示例中,<code>CALLER</code> 選項指定該過程將在調用該過程的用戶的上下文中執行。您還可以指定 SELF、OWNER 和 user_name 等其他選項。有關詳細信息,請參閱<a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/bd517aa3-f06e-4356-87d8-70de5df4494a.htm"><u><font color="#0000ff">EXECUTE AS 子句 (Transact-SQL)</font></u></a>。</p> <div class="code" xmlns=""><span codelanguage="other"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr> <th align="left"></th> <th align="right"><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" style="CURSOR: default" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/copycode.gif" align="absMiddle" name="ccImage">復制代碼</span></th> </tr> <tr><td colspan="2"><pre>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</pre></td></tr> </tbody></table></span></div> <p xmlns="">下面是函數調用。請注意,<code>DATEFIRST</code> 設置為 <code>1</code>。</p> <div class="code" xmlns=""><span codelanguage="other"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr> <th align="left"></th> <th align="right"><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" style="CURSOR: default" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/copycode.gif" align="absMiddle" name="ccImage">復制代碼</span></th> </tr> <tr><td colspan="2"><pre>SET DATEFIRST 1; SELECT dbo.ISOweek(CONVERT(DATETIME,'12/26/2004',101)) AS 'ISO Week';</pre></td></tr> </tbody></table></span></div> <p xmlns="">下面是結果集:</p> <div class="code" xmlns=""><span codelanguage="other"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr> <th align="left"></th> <th align="right"><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" style="CURSOR: default" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/copycode.gif" align="absMiddle" name="ccImage">復制代碼</span></th> </tr> <tr><td colspan="2"><pre>ISO Week ---------------- 52</pre></td></tr> </tbody></table></span></div></content></div> <h3 class="subHeading" xmlns="">B. 創建內聯表值函數</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">以下示例將返回內聯表值函數。對于銷售給商店的每個產品,該函數返回三列,分別為 <code>ProductID</code>、<code>Name</code> 以及各個商店年初至今總數的累計 <code>YTD Total </code>。</p> <div class="code" xmlns=""><span codelanguage="other"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr> <th align="left"></th> <th align="right"><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" style="CURSOR: default" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/copycode.gif" align="absMiddle" name="ccImage">復制代碼</span></th> </tr> <tr><td colspan="2"><pre>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</pre></td></tr> </tbody></table></span></div> <p xmlns="">若要調用該函數,請運行此查詢。</p> <div class="code" xmlns=""><span codelanguage="other"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr> <th align="left"></th> <th align="right"><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" style="CURSOR: default" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/copycode.gif" align="absMiddle" name="ccImage">復制代碼</span></th> </tr> <tr><td colspan="2"><pre>SELECT * FROM Sales.fn_SalesByStore (602);</pre></td></tr> </tbody></table></span></div></content></div> <h3 class="subHeading" xmlns="">C. 創建多語句表值函數</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">以下示例創建了表值函數 <code>fn_FindReports(InEmpID)</code>。如果提供一個有效雇員 ID,該函數將返回一個表,該表對應于直接或間接向該雇員報告的所有雇員。該函數使用遞歸公用表表達式 (CTE) 來生成雇員的層次結構列表。有關遞歸 CTE 的詳細信息,請參閱 <a href="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/27cfb819-3e8d-4274-8bbe-cbbe4d9c2e23.htm"><u><font color="#0000ff">WITH common_table_expression (Transact-SQL)</font></u></a>。</p> <div class="code" xmlns=""><span codelanguage="other"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr> <th align="left"></th> <th align="right"><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" style="CURSOR: default" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/copycode.gif" align="absMiddle" name="ccImage">復制代碼</span></th> </tr> <tr><td colspan="2"><pre>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;</pre></td></tr> </tbody></table></span></div></content></div> <h3 class="subHeading" xmlns="">D. 創建 CLR 函數</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">以下示例假定在本地計算機的默認位置安裝了 <link tabindex="0" keywords="76d3119f-477e-4b1f-941b-acad832cc457">,并且已編譯了 StringManipulate.csproj 示例應用程序。有關詳細信息,請參閱 <link tabindex="0" keywords="9c173ac8-e698-437a-9513-f3951019e7c1">。 </p> <p xmlns="">該示例將創建 CLR 函數 <code>len_s</code>。在創建該函數之前,程序集 <code>SurrogateStringFunction.dll</code> 已在本地數據庫中注冊。 </p> <div class="code" xmlns=""><span codelanguage="other"> <table cellspacing="0" cellpadding="0" width="100%"><tbody> <tr> <th align="left"></th> <th align="right"><span class="copyCode" onkeypress="CopyCode_CheckKey(this)" onmouseover="ChangeCopyCodeIcon(this)" style="CURSOR: default" onclick="CopyCode(this)" tabindex="0" onmouseout="ChangeCopyCodeIcon(this)"><img class="copyCodeImage" src="ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/local/copycode.gif" align="absMiddle" name="ccImage">復制代碼</span></th> </tr> <tr><td colspan="2"><pre>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</pre></td></tr> </tbody></table></span></div></content></div></sections>
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
