﻿-- =============================================
-- Author:		wanggf719
-- Create date: 2022.08.23
-- Description:	SQL Server 启用 CLR 功能
-- Rev: 1.00
-- =============================================

-- 启用CLR功能
	GO 
	-- 启用CLR功能开关
	EXEC sp_configure 'clr enabled', 1; 
	-- 立即生效:
	GO 
	RECONFIGURE; 
	-- 出现“不支持对系统目录进行即席更新 ”的错误时,改用下面语句
	-- GO
	-- RECONFIGURE with override

-- 设置权限：
   
	-- 方式1：关闭"严格安全"选项
		-- 启用高级选项，否则"clr strict security"选项无效
		EXEC sys.sp_configure @configname = 'show advanced options', @configvalue = 1;
		GO
		-- 生效
		RECONFIGURE;
		GO 
		-- 关闭"严格安全"选项
		EXEC sys.sp_configure @configname = 'clr strict security', @configvalue = 0; 
		RECONFIGURE;

	-- 方式2：程序集带签名

	-- 方式3：程序集加入白名单
	GO
	-- 定义程序集Hash值变量
	DECLARE @hash AS BINARY(64);
	-- 获取程序集文件的hash值
	SELECT @hash = HASHBYTES('SHA2_512', (SELECT * FROM OPENROWSET (BULK 'D:\Database\SQL Server\ClrDemo\ClrDll\ClrDemoNet35.dll', SINGLE_BLOB) AS [Data]));
	-- 加入程序集白名单
	EXEC sp_add_trusted_assembly @hash;
	-- 加载程序集

-- 加载程序集
	-- 加载方式1:使用程序集文件
		CREATE ASSEMBLY ClrDemoNet35 FROM 'D:\Database\SQL Server\ClrDemo\ClrDll\ClrDemoNet35.dll'; 
		-- 或者
		CREATE ASSEMBLY ClrDemoNet35 FROM 'D:\Database\SQL Server\ClrDemo\ClrDll\ClrDemoNet35.dll' WITH PERMISSION_SET = UNSAFE; 

	-- 加载方式2:使用文件16进制流
		CREATE ASSEMBLY AssemblyName from 0x123344 -- 其中0x12334……是程序集dll文件的十六进制流。可以使用UltraEdit等编辑器把相关dll文件的十六进制流copy出来。

	-- 加载方式3:SSMS图形化设置：数据库 --> 可编程性 --> 程序集 --> 右键 --> 新建程序集
-- 修改程序集
	GO
	ALTER ASSEMBLY ClrDemoNet35 FROM 'D:\Database\SQL Server\ClrDemo\ClrDll\ClrDemoNet35.dll' WITH PERMISSION_SET = UNSAFE;
	
-- 删除程序集
	DROP ASSEMBLY AssemblyName

-- 在存储过程中使用
GO
-- 创建存储过程，调用Dll方法
CREATE PROCEDURE Pro_ClrDemoNet35_UseClr 
AS
    -- 存储过程主题：好像只能有这一条直接调用语句，加入其它语句直接报语法错误
	EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[UseClr];
GO
-- 使用存储过程（内部调用C#方法）
-- 输出字符串：Hello,SQL Server CLR!
EXEC dbo.Pro_ClrDemoNet35_UseClr;