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.
SQLServerClrDemo/ClrDemoNet35 SQL参考.md

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 
      
    • 方式3SSMS图形化设置

      	数据库 --> 可编程性 --> 程序集 --> 右键 --> 新建程序集
      
  • 更新程序集

    • 方式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 
      
    • 方式3SSMS图形化设置

      	数据库 --> 可编程性 --> 程序集 --> 右键 --> 刷新
      
  • 删除程序集

    • 方式1使用TSQL

      	-- 1、删除依赖项存储过程、函数、类型等
      	-- 2、删除程序集
      	DROP ASSEMBLY AssemblyName
      
    • 方式2SSMS图形化设置

      	数据库 --> 可编程性 --> 程序集 --> 右键 --> 删除
      

创建与调用存储过程

    -- ===========================================
	-- 说  明:向调用客户端发送文本
	-- 方法名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();