SQL调用C# dll(第一中DLL,没使用强名称密匙,默认是 safe)
https://msdn.microsoft.com/zh-cn/library/ms345106(es-es).aspx
1、新建项目名称SQLDllTest,类代码如下,没有用Using引用其他类:
(框架必须改为.NET3.5及3.5以下,因为SQL Server 2008只是支持.NET 3.5及一下,.NET 4.0是2010年发布的,不支持也很正常)
namespace SQLDllTest
{
public class Class1
{
public static string GetStr(string par1)
{
return par1 + "水印";
}
}
}
2、第二步:直接使用SQL语句创建程序集
create assembly TestDll from 'D:\SQLDllTest.dll'
3、第三步:
创建一个Function,使用该dll文件
使用如下SQL语句
CREATE FUNCTION dbo.GetStr
(
@InputString as nvarchar(500)
)
RETURNS nvarchar(200)
AS EXTERNAL NAME TestDll.[SQLDllTest.Class1].GetStr
注意一下标红的那几个单词。
TestDll是指你程序集中dll的名称。
SQLDllTest是指dll文件中那个类的命名空间。
Class1是指dll文件中那个类的类名。
GetStr是指dll文件中那个被调用的静态方法。
4、第四步:开启 clr
exec sp_configure 'show advanced options', '1'; go reconfigure; go exec sp_configure 'clr enabled', '1' go reconfigure; exec sp_configure 'show advanced options', '1'; go
5、第五步:执行方法:
select dbo.GetStr('hahha') as col1
返回: hahha水印
SQL调用C# dll(第二中DLL,强名称密匙)
参考:微软官网 https://msdn.microsoft.com/zh-cn/library/ms345106(es-es).aspx
1、新建项目 SQLDllTestUsingNew
Class1类代码:
using System.Web;
namespace SQLDllTestUsingNew
{
public class Class1
{
public static string GetStr(string par1)
{
return par1 + "水印New";
}
}
}
2、类库项目进行签名,签名后编译【项目】:


3、启用CLR功能:默认情况下,Sql Server中的CLR是关闭的,
exec sp_configure 'clr enabled',1 reconfigure go
4、
注册DLL:
为了调用我们写的那个方法,需要在SQL Server中注册我们刚刚编译好的那个DLL。在此之前,要知道在这个项目中如果要访问服务器之外的资源是要配置权限的。如果不配置,后面操作中会出现类似下面的错误。我找到的关于授权配置的内容:连接。
创建登录名和密钥,如果程序集有变更,要删除密钥和登录名重新创建:
USE master; --此处必须是 master库 GO CREATE ASYMMETRIC KEY SQLCLRSyncKey FROM EXECUTABLE FILE = 'D:\SQLDllTestUsingNew.dll' CREATE LOGIN SQLCLRSyncLogin FROM ASYMMETRIC KEY SQLCLRSyncKey GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRSyncLogin;
GRANT UNSAFE ASSEMBLY TO SQLCLRSyncLogin
创建程序集,DLL变更后要删除重新创建代码如下:
DROP LOGIN SQLCLRSyncLogin DROP ASYMMETRIC KEY SQLCLRSyncKey
5、创建程序集,DLL变更后要删除重新创建:
use TestDB go create ASSEMBLY MySync FROM 'D:\SQLDllTestUsingNew.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS;
如果提示错误:Msg 6522, Level 16, State 1, procedure InsertingRows,Line 0
A .NET Framework error occurred during execution of user defined routine or aggregate 'InsertingRows':
System.Security.SecurityException
改成:create ASSEMBLY MySync FROM 'D:\SQLDllTestUsingNew.dll' WITH PERMISSION_SET = UNSAFE;
6、创建一个函数用于调用这个DLL
CREATE FUNCTION dbo.fun_sync
(
@strSql nvarchar(max)
)
RETURNS nvarchar(max)
AS EXTERNAL NAME [MySync].[SQLDllTestUsingNew.Class1].[GetStr]
7、调用创建的函数。
select dbo.fun_sync('dsdfg')
结果: dsdfg水印New
SQL Server 之 存储过程调用C#编写的dll文件
新建C#类库,编译。
添加引用
using Microsoft.SqlServer.Server;
方法
[SqlFunction]
public static int GenerateTxt()
{
......
}
修改数据库配置
---修改配置 exec sp_configure 'clr enabled', 1; reconfigure;
根据dll路径注册程序集
--从dll中抽取中间语言(IL) USE erp303_szzb_szpa CREATE ASSEMBLY CustomerInfoInterface FROM 'E:\Study\VS2010\PingAnCustomerInfoInterface\PingAnCustomerInfoInterface\bin\Debug\PingAnCustomerInfoInterface.dll'
调用
IF EXISTS ( SELECT *
FROM sysobjects
WHERE id = OBJECT_ID('OnTimeWork') )
BEGIN
DROP PROCEDURE OnTimeWork
END
GO
CREATE PROCEDURE OnTimeWork
AS EXTERNAL NAME
[PingAnCustomerInfoInterface].[PingAnCustomerInfoInterface.GetCustomerInfo].[GenerateTxt]
GO
注意函数调用方法:[AssemblyName].[AssemblyName.ClassName].[FunctionName]

浙公网安备 33010602011771号