You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.8 KiB
6.8 KiB
示例参考
开启CLR功能
GO
-- 启用CLR功能开关
EXEC sp_configure 'clr enabled', 1;
-- 立即生效
GO
RECONFIGURE;
设置权限
-
方法一:关闭"严格安全"选项
-- 启用高级选项,否则"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;
-
方法二:程序集带签名
-- 未验证
-
方法三:程序集加入白名单
-- 定义程序集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进制流
-- 其中0x12334……是程序集dll文件的十六进制流。可以使用UltraEdit等编辑器把相关dll文件的十六进制流copy出来。 CREATE ASSEMBLY AssemblyName from 0x123344
-
方式3:SSMS图形化设置
数据库 --> 可编程性 --> 程序集 --> 右键 --> 新建程序集
-
-
更新程序集
-
方式1:使用程序集文件
ALTER ASSEMBLY ClrDemoNet35 FROM 'D:\\Database\\SQL Server\\ClrDemo\\ClrDll\\ClrDemoNet35.dll'; -- 或者 ALTER ASSEMBLY ClrDemoNet35 FROM 'D:\\Database\\SQL Server\\ClrDemo\\ClrDll\\ClrDemoNet35.dll' WITH PERMISSION_SET = UNSAFE;
-
方式2:使用文件16进制流
-- 其中0x12334……是程序集dll文件的十六进制流。可以使用UltraEdit等编辑器把相关dll文件的十六进制流copy出来。 ALTER ASSEMBLY AssemblyName from 0x123344
-
方式3:SSMS图形化设置
数据库 --> 可编程性 --> 程序集 --> 右键 --> 刷新
-
-
删除程序集
-
方式1:使用TSQL
-- 1、删除依赖项:存储过程、函数、类型等 -- 2、删除程序集: DROP ASSEMBLY AssemblyName
-
方式2:SSMS图形化设置
数据库 --> 可编程性 --> 程序集 --> 右键 --> 删除
-
创建与调用存储过程
-- ===========================================
-- 说 明:向调用客户端发送文本
-- 方法名:UseClr
-- ===========================================
GO
-- 创建存储过程
CREATE PROCEDURE Pro_ClrDemoNet35_UseClr
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[UseClr];
GO
-- 调用存储过程
EXEC dbo.Pro_ClrDemoNet35_UseClr;
-- ===========================================
-- 说 明:获取一个随机整数
-- 方法名:GetRandom
-- ===========================================
GO
-- 创建存储过程
CREATE PROCEDURE Pro_ClrDemoNet35_GetRandom
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[GetRandom];
GO
-- 调用存储过程
EXEC dbo.Pro_ClrDemoNet35_UseClr;
-- ===========================================
-- 说 明:返回总数据行数
-- 使用 SqlContext.Pipe.ExecuteAndSend 直接发送 SqlCommand 结果到客户端(存储过程结果)
-- 方法名:ReturnCount
-- ===========================================
GO
-- 创建存储过程
CREATE PROCEDURE Pro_ClrDemoNet35_ReturnCount
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[ReturnCount];
GO
-- 调用存储过程
EXEC dbo.Pro_ClrDemoNet35_ReturnCount;
-- ===========================================
-- 说 明:获取总数据行数,out参数返回值
-- 方法名:GetCount
-- ===========================================
GO
-- 创建存储过程
CREATE PROCEDURE Pro_ClrDemoNet35_GetCount
(
@totalCount int output
)
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[GetCount];
GO
-- 调用存储过程
EXEC dbo.Pro_ClrDemoNet35_GetCount;
-- ===========================================
-- 说 明:查询数据表
-- 方法名:GetStudents
-- ===========================================
GO
-- 创建存储过程
CREATE PROCEDURE Pro_ClrDemoNet35_GetStudents
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[GetStudents];
GO
-- 调用存储过程
EXEC dbo.Pro_ClrDemoNet35_GetStudents;
-- ===========================================
-- 说 明:使用 SqlDataRecord 发送单行数据
-- 方法名:UseSqlDataRecord
-- ===========================================
GO
-- 创建存储过程
CREATE PROCEDURE Pro_ClrDemoNet35_UseSqlDataRecord
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[UseSqlDataRecord];
GO
-- 调用存储过程
EXEC dbo.Pro_ClrDemoNet35_UseSqlDataRecord;
-- ===========================================
-- 说 明:返回自定义结果集
-- 使用 SendResultsStart SendResultsRow SendResultsEnd
-- 方法名:UseSendResultsRow
-- ===========================================
GO
-- 创建存储过程
CREATE PROCEDURE Pro_ClrDemoNet35_UseSendResultsRow
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[UseSendResultsRow];
GO
-- 调用存储过程
EXEC dbo.Pro_ClrDemoNet35_UseSendResultsRow;
-- ===========================================
-- 说 明:汇总学校学生数量
-- 方法名:SummaryData
-- ===========================================
GO
-- 创建存储过程
CREATE PROCEDURE Pro_ClrDemoNet35_SummaryData
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[SummaryData];
GO
-- 调用存储过程
EXEC dbo.Pro_ClrDemoNet35_SummaryData;
-- ===========================================
-- 说 明:汇总学生数量,直接返回结果
-- 方法名:SummaryStudentCount
-- ===========================================
GO
-- 创建存储过程
CREATE PROCEDURE Pro_ClrDemoNet35_SummaryStudentCount
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[SummaryStudentCount];
GO
-- 调用存储过程
EXEC dbo.Pro_ClrDemoNet35_SummaryStudentCount;
创建与调用自定义函数
-- ===========================================
-- 说 明:标量函数,查询指定学校的学生数量
-- 方法名:QuerySchoolStudentCount
-- ===========================================
CREATE FUNCTION dbo.Fun_ClrDemoNet35_QuerySchoolStudentCount
(
@schoolId INT
)
RETURNS INT
AS
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[QuerySchoolStudentCount]
GO
-- 调用函数
SELECT [dbo].[Fun_ClrDemoNet35_QuerySchoolStudentCount] (1)
GO
-- ===========================================
-- 说 明:表值函数:返回一个数据集合,必须用一个填充数据的方法,在属性中用FillRowMethodName来表示,且返回值应该为IEnumerable类型
-- 查询指定学校的所有学生
-- 方法名:QueryStudent
-- ===========================================
CREATE FUNCTION dbo.Fun_ClrDemoNet35_QueryStudent()
RETURNS TABLE
(
Id INT,
SchoolName NVARCHAR(50),
ClassNumber INT,
StudentNumber INT
)
EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[QueryStudent]
GO
-- 调用函数
SELECT * FROM dbo.Fun_ClrDemoNet35_QueryStudent();