建立 CLR Stored Procedure/Function 的小範例

SQL Server 2005 中, 直接叫用.NET組件是個很特別的功能; 它的使用時點在於當 SQL Program 無法快速有效率的處理我們想做的事, 而且.NET code可以做的比 SQL Program 好時, 我們可以在 SQL Program 中直接叫用 .NET組件中的類別方法, 這些Method必須是static, 這些Method可以被視為Function, Stored Procedure的方式來使用.

以下是一連串的步驟, 說明建立的過程.

1. 標示指定Method

在想要成為CLR Function/Stored Procedure的Static Method上設定Attribute.

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4:  
   5: using Microsoft.SqlServer.Server;
   6:  
   7: namespace HowardCLRInSQLSample
   8: {
   9:     public class HelloCLR
  10:     {
  11:         [SqlFunctionAttribute(Name = "FN_Hello")]
  12:         public static string FN_Hello()
  13:         {
  14:             return "Hello, CLR Function In SQL !!";
  15:         }
  16:  
  17:         [SqlProcedureAttribute(Name = "SP_Hello")]
  18:         public static void SP_Hello()
  19:         {
  20:             SqlContext.Pipe.Send("Hello, CLR Stored Procedure In SQL !!");
  21:         }
  22:     }
  23: }

2. SQL Server 環境建立

   1: -- 啟用SQL Server中的 CLR功能 (預設為關閉)
   2: -- 必須擁有 sysadmin 或 serveradmin 的權限才能啟用此功能
   3: sp_configure 'clr enabled', 1
   4: GO
   5: RECONFIGURE
   6: GO
   7:  
   8: -- 同時必須設定 指定db - Compatibility level -> 90 (即database為SQL Server 2005) 
   9: sp_dbcmptlevel OFD_POLARIS_CUR_EC, 90

3. 註冊組件, 建立CLR Function/Stored Procedure

   1: -- 登錄組件 HowardCLRInSQLSample.dll
   2: -- 任何登錄之後的任何變動(re-build) 皆需重登錄
   3: IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'HowardCLRInSQLSample')
   4: DROP ASSEMBLY HowardCLRInSQLSample;
   5: GO
   6:  
   7: CREATE ASSEMBLY HowardCLRInSQLSample
   8: FROM 'H:\00 IT\Database\SQL Server\SQL 2005\clr in sql server\HowardCLRInSQLSample\HowardCLRInSQLSample\bin\Debug\HowardCLRInSQLSample.dll'
   9: WITH PERMISSION_SET = SAFE;
  10: GO
  11:  
  12: -- 可以用assembly_files來檢視組件的路徑
  13: select * from sys.assembly_files
  14:  
  15: -- 建立clr function
  16: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FN_Hello]') and xtype in (N'FN', N'IF', N'TF', N'FS'))
  17:     drop function [dbo].[FN_Hello]
  18: GO
  19:  
  20: CREATE FUNCTION [dbo].[FN_Hello] ()
  21: Returns  nvarchar(100)
  22: EXTERNAL NAME HowardCLRInSQLSample.[HowardCLRInSQLSample.HelloCLR].FN_Hello
  23:  
  24:  
  25: -- 建立clr sp
  26: IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = N'SP_Hello')
  27:     DROP PROCEDURE [dbo].[SP_Hello];
  28: GO
  29:  
  30: CREATE PROCEDURE [dbo].[SP_Hello]
  31: AS EXTERNAL NAME HowardCLRInSQLSample.[HowardCLRInSQLSample.HelloCLR].SP_Hello
  32: GO

4.大功告成. 就如同使用一般function與stored procedure的方式.

   1: select [dbo].[FN_Hello]()
   2:  
   3: exec SP_Hello
http://hi.baidu.com/thesum/blog/item/1417f9f9c9f1b65f252df29e.html
posted on 2012-05-15 09:42  chen110xi  阅读(182)  评论(0编辑  收藏  举报