SQL SERVER 2005 CLR集成之簡(jiǎn)單SQL函數(shù)講解
今天主要給大家介紹一下關(guān)于SQL SERVER 2005 CLR集成的一些接搜,本文主要針對(duì)SQL SERVER 2005 CLR集成簡(jiǎn)單SQL函數(shù)的一個(gè)步驟和代碼的演示。
第一, 新建類庫(kù),引用命名空間,using Microsoft.SqlServer.Server;
第二, 編寫一個(gè)公共類,含有一個(gè)公共的靜態(tài)函數(shù),并且具有特性:[Microsoft.SqlServer.Server.SqlFunction(DataAccess=DataAccessKind.None)] ,其中的DataAccess=DataAccessKind.None ,意味該函數(shù)不訪問(wèn)用戶數(shù)據(jù),DataAccessKind.Read 枚舉值表示需要訪問(wèn)。
第三,該方法具有返回值, string 類型。
代碼如下:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using Microsoft.SqlServer.Server;
- using System.Data;
- using System.Data.SqlTypes;
- namespace SQLFunctionTEST
- {
- public class SQLFunction
- {
- [Microsoft.SqlServer.Server.SqlFunction(DataAccess=DataAccessKind.None)]
- public static String StringToArray()
- {
- return "hello,world";
- }
- }
- }
第四,編譯此類庫(kù)。
第五,登陸sql,編寫以下代碼:
- CREATE ASSEMBLY SQLFunctionTEST
- FROM 'd:\SQLfunctionTEST.dll'
- WITH permission_set = Safe;
第六,這段代碼的意思就是從本地一個(gè)dll中創(chuàng)建一個(gè)程序集,并且設(shè)置權(quán)限,默認(rèn)有三種選擇:SAFE | EXTERNAL_ACCESS | UNSAFE Safe模式就是最具限制性的權(quán)限集。由具有 SAFE 權(quán)限的程序集所執(zhí)行的代碼將無(wú)法訪問(wèn)外部系統(tǒng)資源,例如文件、網(wǎng)絡(luò)、環(huán)境變量或注冊(cè)表。EXTERNAL_ACCESS 使程序集可以訪問(wèn)某些外部系統(tǒng)資源,例如文件、網(wǎng)絡(luò)、環(huán)境變量以及注冊(cè)表。UNSAFE 可使程序集不受限制地訪問(wèn)資源,無(wú)論是 SQL Server 實(shí)例內(nèi)部還是外部的資源都可以訪問(wèn)。從 UNSAFE 程序集內(nèi)運(yùn)行的代碼可調(diào)用未托管代碼。好了,這樣就創(chuàng)建了一個(gè)叫SQLFunctionTEST 的程序集,那么我開始來(lái)從這個(gè)程序集創(chuàng)建sql function .
第七:在第一次使用SQL SERVER 2005 CLR集成功能的時(shí)候,需要開啟一個(gè)clr選項(xiàng),執(zhí)行以下語(yǔ)句:
- EXEC sp_configure 'clr enabled', '1';
- GO
- RECONFIGURE;
- GO
然后,來(lái)創(chuàng)建函數(shù):
- CREATE FUNCTION TESTFunction() RETURNS nvarchar(200)
- AS EXTERNAL NAME SQLFunctionTEST.[SQLFunctionTEST.SQLFunction]. StringToArray;
這段話是創(chuàng)建一個(gè) Scarlar Valued Function,(譯做標(biāo)量函數(shù)?)返回一個(gè)nvarchar。但是大家看 SQLFunctionTEST.[SQLFunctionTEST.SQLFunction]. StringToArray;
可能有點(diǎn)犯暈,這是哪跟哪啊?沒關(guān)系,我來(lái)講講,第一個(gè)SQLFunctionTEST是指的你從哪個(gè)程序集創(chuàng)建的,就是你create到數(shù)據(jù)庫(kù)的那個(gè)程序集的名字,中括號(hào)里面的SQLFunctionTEST 就是程序集里面的命名空間,然后接著是類名,中括號(hào)右邊就是那個(gè)靜態(tài)方法了。然后,我們就可以用這個(gè)sql Function了。
- declare @x nvarchar (100)
- select @x = dbo.Testfunction()
- select @x as functionReturnValue
再附上一個(gè)使用sql內(nèi)部連接的函數(shù)示例
- using System;
- using System.Data;
- using System.Data.SqlClient;
- using System.Data.SqlTypes;
- using Microsoft.SqlServer.Server;
- public partial class UserDefinedFunctions
- {
- [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
- public static SqlMoney DeterminarValor(string descripcion, int cantidad)
- {
- SqlMoney resultado = 0;
- using (SqlConnection cn = new SqlConnection("context connection=true"))
- {
- cn.Open();
- SqlCommand cmd = new SqlCommand("dbo.TraerItemsPorDescripcion", cn);
- cmd.CommandType = CommandType.StoredProcedure;
- cmd.Parameters.Add(new SqlParameter("@descripcion", " "));
- SqlDataReader rdr = cmd.ExecuteReader();
- while (rdr.Read())
- {
- resultado = rdr.GetSqlMoney(rdr.GetOrdinal("Precio")) * cantidad;
- }
- rdr.Close();
- }
- return resultado;
- }
- };
對(duì)比一下,如果是創(chuàng)建標(biāo)量函數(shù),那么代碼中的靜態(tài)函數(shù)的返回值就是 sql 函數(shù)中的返回值,還要提到的一點(diǎn)就是在clr 創(chuàng)建程序集的sql連接,需要使用 “context connection=true”的連接字符串。這個(gè)連接字符串我馬上就要介紹這個(gè)。
【編輯推薦】