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