|
|
# 示例参考
|
|
|
|
|
|
## 开启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();
|
|
|
|
|
|
|