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

272 lines
6.8 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 示例参考
## 开启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
```
+ 方式3SSMS图形化设置
```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
```
+ 方式3SSMS图形化设置
```SQL
数据库 --> 可编程性 --> 程序集 --> 右键 --> 刷新
```
+ 删除程序集
+ 方式1使用TSQL
```SQL
-- 1、删除依赖项存储过程、函数、类型等
-- 2、删除程序集
DROP ASSEMBLY AssemblyName
```
+ 方式2SSMS图形化设置
```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();