# 示例参考 ## 开启CLR功能 ``` SQL GO -- 启用CLR功能开关 EXEC sp_configure 'clr enabled', 1; -- 立即生效 GO RECONFIGURE; ``` ## 设置权限 + 方法一:关闭"严格安全"选项 ```SQL -- 启用高级选项,否则"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; ``` + 方法二:程序集带签名 ```SQL -- 未验证 ``` + 方法三:程序集加入白名单 ```SQL -- 定义程序集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:使用程序集文件 ```SQL 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进制流 ```SQL -- 其中0x12334……是程序集dll文件的十六进制流。可以使用UltraEdit等编辑器把相关dll文件的十六进制流copy出来。 CREATE ASSEMBLY AssemblyName from 0x123344 ``` + 方式3:SSMS图形化设置 ```SQL 数据库 --> 可编程性 --> 程序集 --> 右键 --> 新建程序集 ``` + 更新程序集 + 方式1:使用程序集文件 ```SQL 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进制流 ```SQL -- 其中0x12334……是程序集dll文件的十六进制流。可以使用UltraEdit等编辑器把相关dll文件的十六进制流copy出来。 ALTER ASSEMBLY AssemblyName from 0x123344 ``` + 方式3:SSMS图形化设置 ```SQL 数据库 --> 可编程性 --> 程序集 --> 右键 --> 刷新 ``` + 删除程序集 + 方式1:使用TSQL ```SQL -- 1、删除依赖项:存储过程、函数、类型等 -- 2、删除程序集: DROP ASSEMBLY AssemblyName ``` + 方式2:SSMS图形化设置 ```SQL 数据库 --> 可编程性 --> 程序集 --> 右键 --> 删除 ``` ## 创建与调用存储过程 ``` SQL -- =========================================== -- 说 明:向调用客户端发送文本 -- 方法名:UseClr -- =========================================== GO -- 创建存储过程 CREATE PROCEDURE Pro_ClrDemoNet35_UseClr AS EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[UseClr]; GO -- 调用存储过程 EXEC dbo.Pro_ClrDemoNet35_UseClr; ``` ``` SQL -- =========================================== -- 说 明:获取一个随机整数 -- 方法名:GetRandom -- =========================================== GO -- 创建存储过程 CREATE PROCEDURE Pro_ClrDemoNet35_GetRandom AS EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[GetRandom]; GO -- 调用存储过程 EXEC dbo.Pro_ClrDemoNet35_UseClr; ``` ``` SQL -- =========================================== -- 说 明:返回总数据行数 -- 使用 SqlContext.Pipe.ExecuteAndSend 直接发送 SqlCommand 结果到客户端(存储过程结果) -- 方法名:ReturnCount -- =========================================== GO -- 创建存储过程 CREATE PROCEDURE Pro_ClrDemoNet35_ReturnCount AS EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[ReturnCount]; GO -- 调用存储过程 EXEC dbo.Pro_ClrDemoNet35_ReturnCount; ``` ``` SQL -- =========================================== -- 说 明:获取总数据行数,out参数返回值 -- 方法名:GetCount -- =========================================== GO -- 创建存储过程 CREATE PROCEDURE Pro_ClrDemoNet35_GetCount ( @totalCount int output ) AS EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[GetCount]; GO -- 调用存储过程 EXEC dbo.Pro_ClrDemoNet35_GetCount; ``` ``` SQL -- =========================================== -- 说 明:查询数据表 -- 方法名:GetStudents -- =========================================== GO -- 创建存储过程 CREATE PROCEDURE Pro_ClrDemoNet35_GetStudents AS EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[GetStudents]; GO -- 调用存储过程 EXEC dbo.Pro_ClrDemoNet35_GetStudents; ``` ``` SQL -- =========================================== -- 说 明:使用 SqlDataRecord 发送单行数据 -- 方法名:UseSqlDataRecord -- =========================================== GO -- 创建存储过程 CREATE PROCEDURE Pro_ClrDemoNet35_UseSqlDataRecord AS EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[UseSqlDataRecord]; GO -- 调用存储过程 EXEC dbo.Pro_ClrDemoNet35_UseSqlDataRecord; ``` ``` SQL -- =========================================== -- 说 明:返回自定义结果集 -- 使用 SendResultsStart SendResultsRow SendResultsEnd -- 方法名:UseSendResultsRow -- =========================================== GO -- 创建存储过程 CREATE PROCEDURE Pro_ClrDemoNet35_UseSendResultsRow AS EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[UseSendResultsRow]; GO -- 调用存储过程 EXEC dbo.Pro_ClrDemoNet35_UseSendResultsRow; ``` ``` SQL -- =========================================== -- 说 明:汇总学校学生数量 -- 方法名:SummaryData -- =========================================== GO -- 创建存储过程 CREATE PROCEDURE Pro_ClrDemoNet35_SummaryData AS EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[SummaryData]; GO -- 调用存储过程 EXEC dbo.Pro_ClrDemoNet35_SummaryData; ``` ``` SQL -- =========================================== -- 说 明:汇总学生数量,直接返回结果 -- 方法名:SummaryStudentCount -- =========================================== GO -- 创建存储过程 CREATE PROCEDURE Pro_ClrDemoNet35_SummaryStudentCount AS EXTERNAL NAME [ClrDemoNet35].[ClrDemoNet35.ClrDemo].[SummaryStudentCount]; GO -- 调用存储过程 EXEC dbo.Pro_ClrDemoNet35_SummaryStudentCount; ``` ## 创建与调用自定义函数 ``` SQL -- =========================================== -- 说 明:标量函数,查询指定学校的学生数量 -- 方法名: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 ``` ``` SQL -- =========================================== -- 说 明:表值函数:返回一个数据集合,必须用一个填充数据的方法,在属性中用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();