亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

在SQL SERVER 2005創(chuàng)建用戶定義函數(shù)語法

系統(tǒng) 1903 0

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

用戶定義函數(shù)可使用 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 } 
}
                

備注

<content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">用戶定義函數(shù)為標量值函數(shù)或表值函數(shù)。如果 RETURNS 子句指定了一種標量數(shù)據(jù)類型,則函數(shù)為標量值函數(shù)。可以使用多條 Transact-SQL 語句定義標量值函數(shù)。</p> <p xmlns="">如果 RETURNS 子句指定 TABLE,則函數(shù)為表值函數(shù)。根據(jù)函數(shù)主體的定義方式,表值函數(shù)可分為內(nèi)聯(lián)函數(shù)或多語句函數(shù)。有關詳細信息,請參閱<?XML:NAMESPACE PREFIX = MSHelp NS = "http://msdn.microsoft.com/mshelp" /><link tabindex="0" keywords="df3a6606-3312-440c-8d6d-2d28575112ed">。</p> <p xmlns="">下列語句在函數(shù)內(nèi)有效: </p> <ul xmlns=""> <li>賦值語句。<br><br> </li> <li>TRY...CATCH 語句以外的流控制語句。<br><br> </li> <li>定義局部數(shù)據(jù)變量和局部游標的 DECLARE 語句。<br><br> </li> <li>SELECT 語句,其中的選擇列表包含為局部變量分配值的表達式。<br><br> </li> <li>游標操作,該操作引用在函數(shù)中聲明、打開、關閉和釋放的局部游標。只允許使用以 INTO 子句向局部變量賦值的 FETCH 語句;不允許使用將數(shù)據(jù)返回到客戶端的 FETCH 語句。<br><br> </li> <li>修改 table 局部變量的 INSERT、UPDATE 和 DELETE 語句。<br><br> </li> <li>調(diào)用擴展存儲過程的 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="">嵌套用戶定義函數(shù)</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">用戶定義函數(shù)可以嵌套;也就是說,用戶定義函數(shù)可相互調(diào)用。被調(diào)用函數(shù)開始執(zhí)行時,嵌套級別將增加;被調(diào)用函數(shù)執(zhí)行結(jié)束后,嵌套級別將減少。用戶定義函數(shù)的嵌套級別最多可達 32 級。如果超出最大嵌套級別數(shù),整個調(diào)用函數(shù)鏈將失敗。 </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 用戶定義函數(shù)對托管代碼的任何引用都將計入 32 級嵌套限制的一個級別。從托管代碼內(nèi)部調(diào)用的方法不根據(jù)此限制進行計數(shù)。 <p></p> </td></tr> </tbody></table> <p></p> </div></content></div> <h3 class="subHeading" xmlns="">函數(shù)屬性</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">在 SQL Server 的早期版本中,函數(shù)只能分為確定性函數(shù)和不確定性函數(shù)兩類。在 SQL Server 2005 中,函數(shù)具有下列屬性。這些屬性的值確定了函數(shù)是否可用于持久化計算列或索引計算列。</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>函數(shù)是確定性函數(shù)還是不確定性函數(shù)。</p> </td> <td> <p>確定性函數(shù)中允許本地數(shù)據(jù)訪問。例如,如果每次使用一組特定輸入值和相同數(shù)據(jù)庫狀態(tài)調(diào)用函數(shù)時,函數(shù)都返回相同結(jié)果,則該函數(shù)將被標記為確定性函數(shù)。</p> </td> </tr> <tr> <td> <p>IsPrecise </p> </td> <td> <p>函數(shù)是精確函數(shù)還是不精確函數(shù)。</p> </td> <td> <p>不精確函數(shù)包含浮點運算之類的運算。</p> </td> </tr> <tr> <td> <p>IsSystemVerified </p> </td> <td> <p>SQL Server 可驗證函數(shù)的精度和確定性屬性。</p> </td> <td> <p></p> </td> </tr> <tr> <td> <p>SystemDataAccess </p> </td> <td> <p>函數(shù)可以訪問 SQL Server 的本地實例中的系統(tǒng)數(shù)據(jù)(系統(tǒng)目錄或虛擬系統(tǒng)表)。</p> </td> <td> <p></p> </td> </tr> <tr> <td> <p>UserDataAccess </p> </td> <td> <p>函數(shù)可以訪問 SQL Server 的本地實例中的用戶數(shù)據(jù)。</p> </td> <td> <p>包含用戶定義表和臨時表,但不包含表變量。</p> </td> </tr> </tbody></table> <p xmlns="">Transact-SQL 函數(shù)的精度和確定性屬性由 SQL Server 自動確定。有關詳細信息,請參閱<link tabindex="0" keywords="58e95e8f-39be-4290-94c8-2f1afce25615">。CLR 函數(shù)的數(shù)據(jù)訪問權(quán)限和確定性屬性可由用戶指定。有關詳細信息,請參閱 <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="">對調(diào)用用戶定義函數(shù)的計算列進行索引</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">如果用戶定義函數(shù)具有下列屬性值,則可以在索引中使用調(diào)用用戶定義函數(shù)的計算列: </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="">從函數(shù)中調(diào)用擴展存儲過程</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">如果在函數(shù)中調(diào)用擴展存儲過程,則該過程不能向客戶端返回結(jié)果集。向客戶端返回結(jié)果集的任何 ODS API 都將返回 FAIL。擴展存儲過程可以連接回 SQL Server 的實例;不過,該過程不應嘗試與調(diào)用擴展存儲過程的函數(shù)同時聯(lián)接到同一事務。</p> <p xmlns="">與通過批處理或存儲過程進行調(diào)用相似,擴展存儲過程在運行 SQL Server 的 Windows 安全帳戶的上下文中執(zhí)行。存儲過程的所有者在授予用戶 EXECUTE 權(quán)限時應考慮這一點。</p></content></div> <h3 class="subHeading" xmlns="">函數(shù)調(diào)用</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">可在使用標量表達式的位置調(diào)用標量值函數(shù)。這包括計算列和 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> 語句執(zhí)行標量值函數(shù)。在允許表表達式的情況下,可在 SELECT、INSERT、UPDATE 或 DELETE 語句的 FROM 子句中調(diào)用表值函數(shù)。有關詳細信息,請參閱<link tabindex="0" keywords="0de7744d-9b73-463f-ae80-e31a020004b5">。</p></content></div> <h3 class="subHeading" xmlns="">在 CLR 函數(shù)中使用參數(shù)和返回值</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">如果在 CLR 函數(shù)中指定了參數(shù),則這些參數(shù)應為 SQL Server 類型,即以前為 scalar_parameter_data_type 定義的類型。有關將 SQL Server 系統(tǒng)數(shù)據(jù)類型與 CLR 集成數(shù)據(jù)類型或 .NET Framework 公共語言運行時數(shù)據(jù)類型進行比較的信息,請參閱 <link tabindex="0" keywords="89b43ee9-b9ad-4281-a4bf-c7c8d116daa2">。 </p> <p xmlns="">為了使 SQL Server 在類中重載時引用正確方法,&lt;method_specifier&gt; 中指示的方法必須具有下列特征: </p> <ul xmlns=""> <li>接收 [ ,...n ] 中指定的參數(shù)數(shù)量。<br><br> </li> <li>通過值而不是引用來接收所有參數(shù)。<br><br> </li> <li>使用與 SQL Server 函數(shù)中指定的類型兼容的參數(shù)類型。<br><br> </li> </ul> <p xmlns="">如果 CLR 函數(shù)的返回數(shù)據(jù)類型指定表類型 (RETURNS TABLE),則 &lt;method_specifier&gt; 中方法的返回數(shù)據(jù)類型應為 IEnumerator 或 IEnumerable 類型,且假定由函數(shù)創(chuàng)建者來實現(xiàn)接口。與 Transact-SQL 函數(shù)不同,CLR 函數(shù)不能在 &lt;table_type_definition&gt; 中包含 PRIMARY KEY、UNIQUE 或 CHECK 約束。 &lt;table_type_definition&gt; 中指定的列的數(shù)據(jù)類型,必須與 &lt;method_specifier&gt; 中的方法在執(zhí)行時返回的結(jié)果集中的對應列的類型匹配。創(chuàng)建函數(shù)時不執(zhí)行上述類型檢查。</p> <p xmlns="">有關對 CLR 函數(shù)編程的詳細信息,請參閱 <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 用戶定義函數(shù)的定義中: </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="">查看有關函數(shù)的信息</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">若要顯示 Transact-SQL 用戶定義函數(shù)的定義,請使用函數(shù)所在數(shù)據(jù)庫中的 <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 選項創(chuàng)建的函數(shù)定義;不過,可顯示有關加密函數(shù)的其他信息。 <p></p> </td></tr> </tbody></table> <p></p> </div> <p xmlns="">若要顯示有關 CLR 用戶定義函數(shù)的信息,請使用函數(shù)所在數(shù)據(jù)庫中的 <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="">若要顯示有關用戶定義函數(shù)中定義的參數(shù)的信息,請使用函數(shù)所在數(shù)據(jù)庫中的 <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="">若要顯示有關函數(shù)引用的對象的報表,請使用 <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>

參數(shù)

<content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><dl xmlns=""> <dt>schema_name </dt> <dd> <p>用戶定義函數(shù)所屬的架構(gòu)的名稱。</p> </dd> </dl> <dl xmlns=""> <dt>function_name </dt> <dd> <p>用戶定義函數(shù)的名稱。函數(shù)名稱必須符合有關<link tabindex="0" keywords="171291bb-f57f-4ad1-8cea-0b092d5d150c">的規(guī)則,并且在數(shù)據(jù)庫中以及對其架構(gòu)來說是唯一的。</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>即使未指定參數(shù),函數(shù)名稱后也需要加上括號。 <p></p> </td></tr> </tbody></table> <p></p> </div> </dd> </dl> <dl xmlns=""> <dt>@parameter_name </dt> <dd> <p>用戶定義函數(shù)的參數(shù)。可聲明一個或多個參數(shù)。 </p> <p>函數(shù)最多可以有 1,024 個參數(shù)。執(zhí)行函數(shù)時,如果未定義參數(shù)的默認值,則用戶必須提供每個已聲明參數(shù)的值。 </p> <p>通過將 at 符號 (@) 用作第一個字符來指定參數(shù)名稱。參數(shù)名稱必須符合有關標識符的規(guī)則。參數(shù)是對應于函數(shù)的局部參數(shù);其他函數(shù)中可使用相同的參數(shù)名稱。參數(shù)只能代替常量,而不能用于代替表名、列名或其他數(shù)據(jù)庫對象的名稱。 </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>在存儲過程或用戶定義函數(shù)中傳遞參數(shù)時,或在批語句中聲明和設置變量時,不會遵守 ANSI_WARNINGS。例如,如果將變量定義為 char(3) 類型,然后將其值設置為多于三個字符,則數(shù)據(jù)將截斷為定義大小,并且 INSERT 或 UPDATE 語句可以成功執(zhí)行。 <p></p> </td></tr> </tbody></table> <p></p> </div> </dd> </dl> <dl xmlns=""> <dt>[ type_schema_name. ] parameter_data_type </dt> <dd> <p>參數(shù)的數(shù)據(jù)類型及其所屬的架構(gòu),后者為可選項。對于 Transact-SQL 函數(shù),可以使用除 timestamp 數(shù)據(jù)類型之外的所有數(shù)據(jù)類型(包括 CLR 用戶定義類型)。對于 CLR 函數(shù),可以使用除 text、ntext、image 和 timestamp 數(shù)據(jù)類型之外的所有數(shù)據(jù)類型(包括 CLR 用戶定義類型)。不能將非標量類型 cursor 和 table 指定為 Transact-SQL 函數(shù)或 CLR 函數(shù)中的參數(shù)數(shù)據(jù)類型。</p> <p>如果未指定 type_schema_name,則 SQL Server 2005 Database Engine將按以下順序查找 scalar_parameter_data_type:</p> <ul> <li>包含 SQL Server 系統(tǒng)數(shù)據(jù)類型名稱的架構(gòu)。<br><br> </li> <li>當前數(shù)據(jù)庫中當前用戶的默認架構(gòu)。<br><br> </li> <li>當前數(shù)據(jù)庫中的 dbo 架構(gòu)。<br><br> </li> </ul> </dd> </dl> <dl xmlns=""> <dt>[ = default ] </dt> <dd> <p>參數(shù)的默認值。如果定義了 default 值,則無需指定此參數(shù)的值即可執(zhí)行函數(shù)。 </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) 數(shù)據(jù)類型之外的 CLR 函數(shù)指定默認參數(shù)值。 <p></p> </td></tr> </tbody></table> <p></p> </div> <p>如果函數(shù)的參數(shù)有默認值,則該函數(shù)檢索默認值時必須指定 DEFAULT 關鍵字。此行為與在存儲過程中使用具有默認值的參數(shù)不同,在后一種情況下,不提供參數(shù)同樣意味著使用默認值。</p> </dd> </dl> <dl xmlns=""> <dt>return_data_type </dt> <dd> <p>標量用戶定義函數(shù)的返回值。對于 Transact-SQL 函數(shù),可以使用除 timestamp 數(shù)據(jù)類型之外的所有數(shù)據(jù)類型(包括 CLR 用戶定義類型)。對于 CLR 函數(shù),可以使用除 text、ntext、image 和 timestamp 數(shù)據(jù)類型之外的所有數(shù)據(jù)類型(包括 CLR 用戶定義類型)。不能將非標量類型 cursor 和 table 指定為 Transact-SQL 函數(shù)或 CLR 函數(shù)中的返回數(shù)據(jù)類型。 </p> </dd> </dl> <dl xmlns=""> <dt>function_body </dt> <dd> <p>指定一系列定義函數(shù)值的 Transact-SQL 語句,這些語句在一起使用不會產(chǎn)生負面影響(例如修改表)。function_body 僅用于標量函數(shù)和多語句表值函數(shù)。</p> <p>在標量函數(shù)中,function_body 是一系列 Transact-SQL 語句,這些語句一起使用的計算結(jié)果為標量值。 </p> <p>在多語句表值函數(shù)中,function_body 是一系列 Transact-SQL 語句,這些語句將填充 TABLE 返回變量。 </p> </dd> </dl> <dl xmlns=""> <dt>scalar_expression </dt> <dd> <p>指定標量函數(shù)返回的標量值。</p> </dd> </dl> <dl xmlns=""> <dt>TABLE </dt> <dd> <p>指定表值函數(shù)的返回值為表。只有常量和 @local_variables 可以傳遞到表值函數(shù)。</p> <p>在內(nèi)聯(lián)表值函數(shù)中,TABLE 返回值是通過單個 SELECT 語句定義的。內(nèi)聯(lián)函數(shù)沒有關聯(lián)的返回變量。 </p> <p>在多語句表值函數(shù)中,@return_variable 是 TABLE 變量,用于存儲和匯總應作為函數(shù)值返回的行。只能將 @return_variable 指定用于 Transact-SQL 函數(shù),而不能用于 CLR 函數(shù)。 </p> </dd> </dl> <dl xmlns=""> <dt>select_stmt </dt> <dd> <p>定義內(nèi)聯(lián)表值函數(shù)的返回值的單個 SELECT 語句。</p> </dd> </dl> <dl xmlns=""> <dt>EXTERNAL NAME &lt;method_specifier&gt;, assembly_name.class_name.method_name </dt> <dd> <p>指定將程序集與函數(shù)綁定的方法。assembly_name 必須與 SQL Server 中當前數(shù)據(jù)庫內(nèi)具有可見性的現(xiàn)有程序集匹配。class_name 必須是有效的 SQL Server 標識符,并且必須作為類存在于程序集中。如果類具有以命名空間限定的名稱,該名稱使用句點 (.) 來分隔命名空間的各部分,則必須使用方括號 ([ ]) 或引號 (" ") 分隔類名稱。method_name 必須是有效的 SQL Server 標識符,并且必須作為靜態(tài)方法存在于指定類中。</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 不能執(zhí)行 CLR 代碼。可以創(chuàng)建、修改和刪除引用公共語言運行時模塊的數(shù)據(jù)庫對象;不過,只有在啟用 <link tabindex="0" xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5" keywords="0722d382-8fd3-4fac-b4a8-cd2b7a7e0293">之后,才能在 SQL Server 中執(zhí)行這些引用。若要啟用此選項,請使用 <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>&lt;table_type_definition&gt;, ( { &lt;column_definition&gt; &lt;column_constraint&gt; , | &lt;computed_column_definition&gt; } , [ &lt;table_constraint&gt; ] [ ,...n ], ) , </dt> <dd> <p>定義 Transact-SQL 函數(shù)的表數(shù)據(jù)類型。表聲明包含列定義和列約束(或表約束)。表始終放在主文件組中。</p> </dd> </dl> <dl xmlns=""> <dt>&lt; clr_table_type_definition &gt; , ( { column_name data_type } [ ,...n ] ), </dt> <dd> <p>定義 CLR 函數(shù)的表數(shù)據(jù)類型。表聲明僅包含列名稱和數(shù)據(jù)類型。表始終放在主文件組中。</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="">&lt;function_option&gt;::= and &lt;clr_function_option&gt;::=</p> <p xmlns="">指定函數(shù)將具有以下一個或多個選項:</p> <dl xmlns=""> <dt>ENCRYPTION </dt> <dd> <p>指示數(shù)據(jù)庫引擎對包含 CREATE FUNCTION 語句文本的目錄視圖列進行加密。使用 ENCRYPTION 可以防止將函數(shù)作為 SQL Server 復制的一部分發(fā)布。不能為 CLR 函數(shù)指定 ENCRYPTION。</p> </dd> </dl> <dl xmlns=""> <dt>SCHEMABINDING </dt> <dd> <p>指定將函數(shù)綁定到其引用的數(shù)據(jù)庫對象。如果其他架構(gòu)綁定對象也在引用該函數(shù),此條件將防止對其進行更改。</p> <p>只有發(fā)生下列操作之一時,才會刪除函數(shù)與其引用對象的綁定: </p> <ul> <li>刪除函數(shù)。<br><br> </li> <li>在未指定 SCHEMABINDING 選項的情況下,使用 ALTER 語句修改函數(shù)。<br><br> </li> </ul> <p>只有滿足以下條件時,函數(shù)才能綁定到架構(gòu): </p> <ul> <li>函數(shù)為 Transact-SQL 函數(shù)。<br><br> </li> <li>該函數(shù)引用的用戶定義函數(shù)和視圖也綁定到架構(gòu)。<br><br> </li> <li>該函數(shù)引用的對象是用由兩部分組成的名稱引用的。<br><br> </li> <li>該函數(shù)及其引用的對象屬于同一數(shù)據(jù)庫。<br><br> </li> <li>執(zhí)行 CREATE FUNCTION 語句的用戶對該函數(shù)引用的數(shù)據(jù)庫對象具有 REFERENCES 權(quán)限。<br><br> </li> </ul> <p>不能為 CLR 函數(shù)或引用別名數(shù)據(jù)類型的函數(shù)指定 SCHEMABINDING。 </p> </dd> </dl> <dl xmlns=""> <dt>RETURNS NULL ON NULL INPUT | <u>CALLED ON NULL INPUT</u> </dt> <dd> <p>指定標量值函數(shù)的 OnNULLCall 屬性。如果未指定,則默認為 CALLED ON NULL INPUT。這意味著即使傳遞的參數(shù)為 NULL,也將執(zhí)行函數(shù)體。 </p> <p>如果在 CLR 函數(shù)中指定了 RETURNS NULL ON NULL INPUT,它指示當 SQL Server 接收到的任何一個參數(shù)為 NULL 時,它可以返回 NULL,而無需實際調(diào)用函數(shù)體。如果 &lt;method_specifier&gt; 中指定的 CLR 函數(shù)的方法已具有指示 RETURNS NULL ON NULL INPUT 的自定義屬性,但 CREATE FUNCTION 語句指示 CALLED ON NULL INPUT,則優(yōu)先采用 CREATE FUNCTION 語句指示的屬性。不能為 CLR 表值函數(shù)指定 OnNULLCall 屬性。 </p> </dd> </dl> <dl xmlns=""> <dt>EXECUTE AS 子句 </dt> <dd> <p>指定用于執(zhí)行用戶定義函數(shù)的安全上下文。所以,您可以控制 SQL Server 使用哪一個用戶帳戶來驗證針對該函數(shù)引用的任何數(shù)據(jù)庫對象的權(quán)限。</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>不能為內(nèi)聯(lián)用戶定義函數(shù)指定 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="">&lt; column_definition &gt;::=</p> <p xmlns="">定義表數(shù)據(jù)類型。表聲明包含列定義和約束。對于 CLR 函數(shù),只能指定 column_name 和 data_type。</p> <dl xmlns=""> <dt>column_name </dt> <dd> <p>表中列的名稱。列名稱必須符合標識符規(guī)則,并且在表中必須是唯一的。column_name 可以由 1 至 128 個字符組成。</p> </dd> </dl> <dl xmlns=""> <dt>data_type </dt> <dd> <p>指定列數(shù)據(jù)類型。對于 Transact-SQL 函數(shù),可以使用除 timestamp 之外的所有數(shù)據(jù)類型(包括 CLR 用戶定義類型)。對于 CLR 函數(shù),可以使用除 text、ntext、image、char、varchar、varchar(max) 和 timestamp 之外的所有數(shù)據(jù)類型(包括 CLR 用戶定義類型)。在 Transact-SQL 或 CLR 函數(shù)中,非標量類型 cursor 不能指定為列數(shù)據(jù)類型。</p> </dd> </dl> <dl xmlns=""> <dt>DEFAULT constant_expression </dt> <dd> <p>指定當插入過程中沒有顯式提供值時為列提供的值。constant_expression 可以是常量、NULL 或系統(tǒng)函數(shù)值。DEFAULT 定義可以應用于除具有 IDENTITY 屬性的列之外的任何列。不能為 CLR 表值函數(shù)指定 DEFAULT。</p> </dd> </dl> <dl xmlns=""> <dt>COLLATE collation_name </dt> <dd> <p>指定列的排序規(guī)則。如果未指定,則為此列分配數(shù)據(jù)庫的默認排序規(guī)則。排序規(guī)則名稱既可以是 Windows 排序規(guī)則名稱,也可以是 SQL 排序規(guī)則名稱。有關排序規(guī)則的列表及詳細信息,請參閱 <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 排序規(guī)則名稱 (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 排序規(guī)則名稱 (Transact-SQL)</font></u></a>。</p> <p>COLLATE 子句只能用來更改數(shù)據(jù)類型為 char、varchar、nchar 和 nvarchar 的列的排序規(guī)則。 </p> <p>不能為 CLR 表值函數(shù)指定 COLLATE。</p> </dd> </dl> <dl xmlns=""> <dt>ROWGUIDCOL </dt> <dd> <p>指示新列是行的全局唯一標識符列。對于每個表,只能將其中的一個 uniqueidentifier 列指定為 ROWGUIDCOL 列。ROWGUIDCOL 屬性只能分配給 uniqueidentifier 列。 </p> <p>ROWGUIDCOL 屬性并不強制實現(xiàn)列中存儲的值的唯一性。該屬性也不會為插入表的新行自動生成值。若要為每列生成唯一值,請在 INSERT 語句中使用 NEWID 函數(shù)。可以指定默認值;但是,不能將 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) 列。每個表只能創(chuàng)建一個標識列。不能將綁定默認值和 DEFAULT 約束用于標識列。必須同時指定 seed 和 increment,或者二者都不指定。如果二者都未指定,則取默認值 (1,1)。</p> <p>不能為 CLR 表值函數(shù)指定 IDENTITY。</p> <dl> <dt>seed </dt> <dd> <p>要分配給表中第一行的整數(shù)值。</p> </dd> </dl> <dl> <dt>increment </dt> <dd> <p>要加到表中后續(xù)行的 seed 值上的整數(shù)值。</p> </dd> </dl> </dd> </dl></content></div> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">&lt; column_constraint &gt;::= and &lt; table_constraint&gt;::=</p> <p xmlns="">為指定列或表定義約束。對于 CLR 函數(shù),允許的唯一約束類型為 NULL。不允許命名約束。</p> <dl xmlns=""> <dt>NULL | NOT NULL </dt> <dd> <p>確定列中是否允許空值。嚴格講來,NULL 不是約束,但可以像指定 NOT NULL 那樣指定它。不能為 CLR 表值函數(shù)指定 NOT NULL。</p> </dd> </dl> <dl xmlns=""> <dt>PRIMARY KEY </dt> <dd> <p>一個約束,該約束通過唯一索引來強制指定列的實體完整性。在表值用戶定義函數(shù)中,只能對每個表中的一列創(chuàng)建 PRIMARY KEY 約束。不能為 CLR 表值函數(shù)指定 PRIMARY KEY。</p> </dd> </dl> <dl xmlns=""> <dt>UNIQUE </dt> <dd> <p>一個約束,該約束通過唯一索引為一個或多個指定列提供實體完整性。一個表可以有多個 UNIQUE 約束。不能為 CLR 表值函數(shù)指定 UNIQUE。</p> </dd> </dl> <dl xmlns=""> <dt>CLUSTERED | NONCLUSTERED </dt> <dd> <p>指示為 PRIMARY KEY 或 UNIQUE 約束創(chuàng)建聚集索引還是非聚集索引。PRIMARY KEY 約束使用 CLUSTERED,而 UNIQUE 約束使用 NONCLUSTERED。</p> <p>只能為一個約束指定 CLUSTERED。如果為 UNIQUE 約束指定了 CLUSTERED,并且指定了 PRIMARY KEY 約束,則 PRIMARY KEY 使用 NONCLUSTERED。</p> <p>不能為 CLR 表值函數(shù)指定 CLUSTERED 和 NONCLUSTERED。 </p> </dd> </dl> <dl xmlns=""> <dt>CHECK </dt> <dd> <p>一個約束,該約束通過限制可輸入一列或多列中的可能值來強制實現(xiàn)域完整性。不能為 CLR 表值函數(shù)指定 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="">&lt;computed_column_definition&gt;::=</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="">&lt;index_option&gt;::=</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>指定一個百分比,指示在創(chuàng)建或更改索引期間,數(shù)據(jù)庫引擎對各索引頁的葉級填充的程度。fillfactor 必須為介于 1 至 100 之間的整數(shù)值。默認值為 0。 </p> </dd> </dl> <dl xmlns=""> <dt>IGNORE_DUP_KEY = { ON | <u>OFF</u> } </dt> <dd> <p>指定當對唯一聚集索引或唯一非聚集索引的多行插入事務中出現(xiàn)重復鍵值時的錯誤響應。默認值為 OFF。</p> </dd> </dl> <dl xmlns=""> <dt>STATISTICS_NORECOMPUTE = { ON | <u>OFF</u> } </dt> <dd> <p>指定是否重新計算分布統(tǒng)計信息。默認值為 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>

權(quán)限

<content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">需要在數(shù)據(jù)庫中具有 CREATE FUNCTION 權(quán)限,并對創(chuàng)建函數(shù)時所在的架構(gòu)具有 ALTER 權(quán)限。如果函數(shù)指定用戶定義類型,則需要對該類型具有 EXECUTE 權(quán)限。</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 周的標量值用戶定義函數(shù)</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">以下示例將創(chuàng)建用戶定義函數(shù) <code>ISOweek</code>。此函數(shù)使用日期參數(shù)來計算 ISO 周數(shù)。要使此函數(shù)能正確計算,必須在調(diào)用該函數(shù)前調(diào)用 <code>SET DATEFIRST 1</code>。 </p> <p xmlns="">另外,該示例將顯示如何使用 <code>EXECUTE AS</code> 子句指定可在其中執(zhí)行存儲過程的安全上下文。在該示例中,<code>CALLER</code> 選項指定該過程將在調(diào)用該過程的用戶的上下文中執(zhí)行。您還可以指定 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))&gt;= 28)) SET @ISOweek=1 RETURN(@ISOweek) END; GO</pre></td></tr> </tbody></table></span></div> <p xmlns="">下面是函數(shù)調(diào)用。請注意,<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="">下面是結(jié)果集:</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. 創(chuàng)建內(nèi)聯(lián)表值函數(shù)</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">以下示例將返回內(nèi)聯(lián)表值函數(shù)。對于銷售給商店的每個產(chǎn)品,該函數(shù)返回三列,分別為 <code>ProductID</code>、<code>Name</code> 以及各個商店年初至今總數(shù)的累計 <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="">若要調(diào)用該函數(shù),請運行此查詢。</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. 創(chuàng)建多語句表值函數(shù)</h3> <div class="subSection" xmlns=""><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5"><p xmlns="">以下示例創(chuàng)建了表值函數(shù) <code>fn_FindReports(InEmpID)</code>。如果提供一個有效雇員 ID,該函數(shù)將返回一個表,該表對應于直接或間接向該雇員報告的所有雇員。該函數(shù)使用遞歸公用表表達式 (CTE) 來生成雇員的層次結(jié)構(gòu)列表。有關遞歸 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. 創(chuàng)建 CLR 函數(shù)</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="">該示例將創(chuàng)建 CLR 函數(shù) <code>len_s</code>。在創(chuàng)建該函數(shù)之前,程序集 <code>SurrogateStringFunction.dll</code> 已在本地數(shù)據(jù)庫中注冊。 </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>

在SQL SERVER 2005創(chuàng)建用戶定義函數(shù)語法


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本高清中文字幕视频在线 | 四虎永久网址在线观看 | 亚洲一区视频在线 | 欧美影视一区 | 第一福利在线观看 | 国产成人综合网亚洲欧美在线 | 欧美日韩午夜视频 | 国产精选在线播放 | 婷婷综合网站 | 久青草资源福利视频 | 日韩精品一区二区三区中文3d | 欧美一级毛片免费观看视频 | 6080一级毛片 | chinese国产xxxx中国 | 久久久亚洲欧洲日产国码二区 | 国产女主播在线 | 美女嗯啊 | 九九精品视频一区在线 | 国内精品久久久久久西瓜色吧 | 综合久久国产对白 | 国产精品人成 | 成人国产精品视频频 | 中国国产高清一级毛片 | 成人激情开心网 | 中文字幕亚洲精品日韩精品 | 成人a大片高清在线观看 | 午夜影院一区二区三区 | 91免费国产高清观看 | 色综合一区 | 色综合久久久久久久久五月性色 | 国产青草 | 天堂va亚洲va欧美va国产 | 欧美一级毛片欧美一级无片 | 日本二区视频 | 欧美午夜在线观看 | 91精品国产91久久久久 | 野花成人 | 免费欧美日韩 | 四虎永久免费观看紧急入口 | 国产精品亚洲欧美日韩区 | 88国产精品欧美一区二区三区 |