什么是扩展?
扩展存储过程使您得以使用象C这样的创建自己的外部例程。对用户来说,扩展存储过程与普通存储过程一样,执行方法也相同。可将参数传递给扩展存储过程,扩展存储过程可返回结果,也可返回状态。扩展存储过程可用于扩展Microsoft SQL Server™2000的功能。
扩展存储过程是SQL Server可以动态装载并执行的动态链接库(DLL)。扩展存储过程直接在SQL Server的地址空间运行,并使用SQL Server开放式数据服务(ODS)API编程。
编写好扩展存储过程后,固定服务器角色sysadmin的成员即可在SQL Server中注册该扩展存储过程,然后授予其他用户执行该过程的权限。扩展存储过程只能添加到master数据库中。
使用C#编写扩展存储过程
下面就以一个简单的例子来演示如何用C#编写扩展存储过程。
首先,我们创建一个简单的C#类库文件:
//C# file: Csserver.cs
usingSystem;
usingSystem.Runtime.InteropServices;
usingSystem.Reflection;
usingSystem.Runtime.CompilerServices;
[assembly:AssemblyTitle("CSServer")]
[assembly:AssemblyDescription("Test SQL .NET interop")]
[assembly:AssemblyVersion("1.0.0.1")]
[assembly:AssemblyDelaySign(false)]
[assembly:AssemblyKeyFile("MyKey.snk")]
namespace SQLInterop
扩展存储过程使您得以使用象C这样的创建自己的外部例程。对用户来说,扩展存储过程与普通存储过程一样,执行方法也相同。可将参数传递给扩展存储过程,扩展存储过程可返回结果,也可返回状态。扩展存储过程可用于扩展Microsoft SQL Server™2000的功能。
扩展存储过程是SQL Server可以动态装载并执行的动态链接库(DLL)。扩展存储过程直接在SQL Server的地址空间运行,并使用SQL Server开放式数据服务(ODS)API编程。
编写好扩展存储过程后,固定服务器角色sysadmin的成员即可在SQL Server中注册该扩展存储过程,然后授予其他用户执行该过程的权限。扩展存储过程只能添加到master数据库中。
使用C#编写扩展存储过程
下面就以一个简单的例子来演示如何用C#编写扩展存储过程。
首先,我们创建一个简单的C#类库文件:
//C# file: Csserver.cs
usingSystem;
usingSystem.Runtime.InteropServices;
usingSystem.Reflection;
usingSystem.Runtime.CompilerServices;
[assembly:AssemblyTitle("CSServer")]
[assembly:AssemblyDescription("Test SQL .NET interop")]
[assembly:AssemblyVersion("1.0.0.1")]
[assembly:AssemblyDelaySign(false)]
[assembly:AssemblyKeyFile("MyKey.snk")]
namespace SQLInterop
{
public interface ITest
{
string SayHello();
}
[ClassInterface(ClassInterfaceType.AutoDual)]
public class CsharpHelper : ITest
[ClassInterface(ClassInterfaceType.AutoDual)]
public class CsharpHelper : ITest
{
public string SayHello()
{
return "Hello from CSharp";
}
}
}
然后创建用 sn-k 为该类库创建一个强名密钥文件,并编译之。
sn-k MyKey.snk
csc /t:library Csserver.cs
注册该类库:
regasm /tlb:Csserver.tlb csserver.dll /codebase
这样一个扩展存储过程就编写注册完了,下面我们在sqlserver中测试一下效果。
T-SQLstoredproc.
DECLARE @object int
DECLARE @hr int
DECLARE @property varchar(255)
DECLARE @return varchar(255)
DECLARE @src varchar(255),@desc varchar(255)
--创建对象实例。
EXEC @hr = sp_OACreate‘SQLInterop.CsharpHelper‘,@object OUT
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END
--调用对象方法。
EXEC@hr=sp_OAMethod @object,‘SayHello‘,@return OUT
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END
PRINT@return
--销毁对象实例。
EXEC @hr=sp_OADestroy @object
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END
}
}
然后创建用 sn-k 为该类库创建一个强名密钥文件,并编译之。
sn-k MyKey.snk
csc /t:library Csserver.cs
注册该类库:
regasm /tlb:Csserver.tlb csserver.dll /codebase
这样一个扩展存储过程就编写注册完了,下面我们在sqlserver中测试一下效果。
T-SQLstoredproc.
DECLARE @object int
DECLARE @hr int
DECLARE @property varchar(255)
DECLARE @return varchar(255)
DECLARE @src varchar(255),@desc varchar(255)
--创建对象实例。
EXEC @hr = sp_OACreate‘SQLInterop.CsharpHelper‘,@object OUT
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END
--调用对象方法。
EXEC@hr=sp_OAMethod @object,‘SayHello‘,@return OUT
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END
PRINT@return
--销毁对象实例。
EXEC @hr=sp_OADestroy @object
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END