SQL--CLR概述
Visual Studio 2005 支持在 SQL Server 2005 中开发、部署和调试托管代码。有一种新的项目类型(称为 SQL Server 项目),它允许开发人员在 SQL Server 中开发、部署和调试例程(函数、过程和触发器)、类型和聚合。
构建和部署
SQL Server 项目提供了代码模板,这使得开发人员能够轻松地开始为基于 CLR 的数据库例程、类型和聚合编写代码。该项目还允许添加对数据库中其他的程序集的引用。在构建项目时,可以将其编译成一个程序集。部署此程序集可以将程序集的二进制文件上载到与该项目相关联的 SQL Server 数据库中。部署操作还自动创建在数据库的程序集中定义的例程、类型和聚合,方法是使用在代码中定义的自定义属性(SqlProcedure、SqlFunction 和 SqlTrigger 等等)。它还上载与该程序集相关联的源代码和 .pdb 文件(调试符号)。
调试
对于任何平台来说,调试都是开发人员体验的基本部分。SQL Server 2005 和 Visual Studio 2005 为数据库编程人员提供了这些功能。调试 SQL Server 2005 对象的关键部分在于其易于安装和使用。调试到运行 SQL Server 的计算机的连接在很大程度上同调试传统操作系统中运行的进程的方式一样。调试器的功能不会受到客户端到服务器的连接类型的影响。这样就可以调试表格数据流 (TDS) 和 HTTP 连接。而且,还可以跨语言进行无缝调试。因此,如果有一个调用 CLR 存储过程的 T-SQL 存储过程,调试会允许您从 T-SQL 过程进入到 CLR 过程。
在这里我只是简单的介绍一下吧,其实还有很多这方面的知识,大家可以到微软的官方网站上去查看一下我给个链接吧方便查找
http://www.microsoft.com/china/msdn/library/data/sqlserver/sqlclrguidance.mspx?mfr=true 这上面说的很细,包括Clr和Xp的特性也有介绍
在这里我分享一下我经常使用的一些功能 吧,CLR 集成到低是做什么的呢?大家平时在数据库里写的存储过程 ,函数,还有触发器等这些东西都 是存在于数据库里的,不能跟前台的程序代码发生关系,Clr大家都 知道是支持语言的基本环境,有了他,我们就可以在Sql里部署我们用c#或是VB编写的代码了,也就是说我们在c#里写一个函数可以在Sql里直接被执行,大家是不是感觉这样很神奇呢?如果真的是这样的话,那以后数据库里再有什么复咋的逻辑直接用c#代码写一定会很方便,下面我就一个一个的很大家分享一下吧,我们先从函数入手吧
CLR中的函数
第一步 建立环境
首先我们要打开Sql2005的IDE,新建 一个数据库,这个过程 就不多说了,数据库名称 是 Text
下在我们打开VS2005 或是2008(选择.net2.0因为这里只支持2.0的CLR)新建项目

在这里跟新建其它项目就有很大不同的,我们要选择一个Office下的数据库,选择SqlServer项目 名称为 SqlClrProject 位置您可以自己选择电脑上的任意位置就可以了,单击确定

在这里我们要选择一下自己的数据,如果你不是第一次的话那么会默认的列出所有选择过的数据库,而这里我的选择过了所以出现一个 已有的选择项,当然如果 你是第一次的话 是没有选择项目的,这时我们单击 添加新引用(A)...

相信这里大家都 很熟悉了吧,选择一下我们刚刚建好的数据库吧,
然后单击确定

在这里我们单击是就可以了,因为我们得启用它来调试我们下面的操作

新建好的项目结构如上图所显
因为我们这里要使用函数,所以我们右击项目---添加

我们可以看的到里面已经出了很多数据库中常用的对象了,
我们单击新建项也就是第一个

我们给函数名称改为StrCount意思就是统计一下输入的字符个数
我们选择的是用户定义的函数
好了单击添加就可以了,
系统会自动生成一段代码
代码 using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server; public partial class UserDefinedFunctions
{ //表示注册为Sql中的函数
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString StrCount()
{
// 在此处放置代码
return new SqlString("Hello");
}
};
到这里我们的前期准备工作就完了,我们只要修改这个类就行了,
[Microsoft.SqlServer.Server.SqlFunction]
这句是表示在Sql中的对象类型
SqlFunction 就是函数
SqlProcedure 存储过程
SqlTrigger 触发器
还有其它的大家自己查看一下吧
第二步 部署自己定义函数
我们这个函数是用来计算字符长度的我把完成的代码放在下在面
代码 using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server; public partial class UserDefinedFunctions
{ //表示注册为Sql中的函数
[Microsoft.SqlServer.Server.SqlFunction]
public static string StrCount(string str)
{
// 返回字符串的长度
return str.Length.ToString();
}
};
现在函数写好了,这个函数就不做过多的解释了, 因这这个只是得到字符串的长度这东西太基础了,呵呵
我们怎么样才能在Sql2005里使用我们这个函数呢?
其实很简单我们生成一下项目,生成成功之后,我们右击项目

单击部署项目,等部署成功就可以了。那我们部署的程序在那里呢,现在我们打开Sql2005IDE
找到如下图所示

我们会发现在Sql2005里的标题值函数里出现了一个我们自己定义的函数,那怎么使用他呢,很简单其实是跟我们平时使用的是一样的
我们新建查询

因为我们Sql默认的是关闭CLR功能的,我们需要用命令开启一下
看到如上图所显示的就表示 你的功能开启成功了,下面我们就可以自由的使用函数了,跟使用系统自己定义的函数是一样的,下面我统计几个大家可以看下图

这样一这样
这样就是利用sql的ClR执行c#程序了,是不是很方便,当然我们可以根据自己的需要把这个函数改的复咋一下,不过方法都是一样的像存储过程和触发器的实现原理都 也是这样的。
我加上一段,调试功能 是.net里用来解决问题最多的功能了,那CLR是否支持呢?答案是肯定的,只要我们在这个Text.Sql文件里打个段点就行了,因为在这个文件里执行的结果和数据库里的是一样的
代码 -- 运用此程序集实现的不同 SQL 对象的查询示例 -----------------------------------------------------------------------------------------
-- 存储过程
-----------------------------------------------------------------------------------------
-- exec StoredProcedureName -----------------------------------------------------------------------------------------
-- 用户定义的函数
-----------------------------------------------------------------------------------------
-- select dbo.FunctionName() -----------------------------------------------------------------------------------------
-- 用户定义的类型
-----------------------------------------------------------------------------------------
-- CREATE TABLE test_table (col1 UserType)
-- go
--
-- INSERT INTO test_table VALUES (convert(uri, 'Instantiation String 1'))
-- INSERT INTO test_table VALUES (convert(uri, 'Instantiation String 2'))
-- INSERT INTO test_table VALUES (convert(uri, 'Instantiation String 3'))
--
-- select col1::method1() from test_table -----------------------------------------------------------------------------------------
-- 用户定义的类型
-----------------------------------------------------------------------------------------
-- select dbo.AggregateName(Column1) from Table1 select '要运行项目,请编辑项目中的 Test.sql 文件。此文件位于解决方案资源管理器的 Test Scripts 文件夹中。'
我们可以跟自己的Sql语句结合起来使用,就是用到我们自己定义的存储过程里这样可以把复咋的逻辑用c#代码来实现是不是感觉很方便,Clr是个好东西,他不仅仅只有这些,还有什么高级的功能 呢,我们下次博文接着说吧!!!
为了方便大家写代码我在这里加上
use Text EXEC sp_configure 'show advanced options','1';
go EXEC sp_configure 'clr enabled','1'
go reconfigure with override;
go
SQL--CLR概述的更多相关文章
- SQL Server Assembly (SQL CLR) 还原数据库后的问题
最近弄项目迁移的时候遇到还原数据库(SQL Server 2008)后遇到的一个问题: 消息 10314,级别 16,状态 11,第 1 行 在尝试加载程序集 ID 65536 时 Microsoft ...
- Oracle-05-SQL语句概述、分类&SQL*PLUS概述(初识insert,desc,list,r,del,a,c,n等命令)
一.SQL语句概述 (1)SQL全程是"结构化查询语言(Structured Query Language)". SQL是大多数主流数据库系统採用的标准查询语言. (2)SQL语句 ...
- SQL CLR学习
SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Serv ...
- SQL语言概述
功能概述 DDL,数据库定义语言,创建,修改,删除数据库,表,视图,索引,约束条件等 DML,数据库操纵语言,对数据库中的数据进行增,删,改,查 DCL,数据库定义语言,对数据库总数据的访问设置权限 ...
- c# SQL CLR 之一
CLR就是公共运行时,本文就对c#编写SQL StoredProcedures的过程进行简单讲解. [步骤] 2. 3. 7.打开设置 8. 注意删除方式:注意删除Assembly时,一定要先把引用此 ...
- 第一讲:SQL语言概述
SQL语言是集DDL.DML和DCL于一体的数据库语言. SQL语言之DDL:定义数据库 SQL语言之DML:操纵数据库 一.功能概述 SQL语言主要由以下9个单词引导的操作语句来构成,但每一条语句都 ...
- Spark SQL catalyst概述和SQL Parser的具体实现
之前已经对spark core做了较为深入的解读,在如今SQL大行其道的背景下,spark中的SQL不仅在离线batch处理中使用广泛,structured streamming的实现也严重依赖spa ...
- PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明
用CLR写函数:标量函数,表值函数 很好理解,如果用聚合函数则不是那么好理解了, 这里将CLR函数说明一下,其实关键是对聚合函数说明 用CLR写聚合函数关键点,是要理解CLR与SQL是如何进行数据交互 ...
- Sql CLR创建一个简单的表值函数
1.创建面目: 2. 添加函数代码: using System; using System.Data.Sql; using Microsoft.SqlServer.Server; using Syst ...
- SQL server概述
sqlserver中包含的对象: 数据库.事务日志.索引.文件组.数据库关系图.视图.存储过程.用户自定义函数.用户.角色.程序集.表.报表.全文目录.用户自定义数据类型 数据库实际上是最高层对象,其 ...
随机推荐
- 一题多解(一) —— list(Python)判空(以及 is 与 == 的区别)
>> l = [] 1. == >> l == [] True 2. not >> not l True 3. 注意 is 与 == 的区别 >> l ...
- javascript系列-class5.数组
转载请标明出处! 栈堆结构: 堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除. 栈:存放的是路径:容量有限(在一开始被定义之后就不会改变了): ...
- BZOJ 3339 线段树
思路: 考虑离线处理 显然 l固定时 r越大 ans越大 那我们不妨按照l从小到大排序 l->l+1的时候 l到next[l]这段区间都跟a[l]取min就好了 搞颗线段树维护一下 //By S ...
- select2多选
在TCX_1710项目中的拒绝代码配置页面可以选择多个拒绝字段,效果图如下 代码中需要注意的有以下地方:图1为提交保存时对多选数据的获取,图2为修改是对多选数据的回显 对于多选框宽度太窄的问题,可以参 ...
- (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...
- 51nod 1098 最小方差 排序+前缀和+期望方差公式
题目: 题目要我们,在m个数中,选取n个数,求出这n个数的方差,求方差的最小值. 1.我们知道,方差是描述稳定程度的,所以肯定是着n个数越密集,方差越小. 所以我们给这m个数排个序,从连续的n个数中找 ...
- Uva 1605 Building for UN【构造法】
题意:给出n个国家,给它们分配办公室,使得任意两个国家都有一对相邻的格子 看的紫书,最开始看的时候不理解 后来还是搜了题解--- 发现是这样的 比如说5个国家 应该输出 AAAA BBBB CCCC ...
- gcd的queue与group
queue相当于事件处理机制里的事件池:只是任务池: 线程作为事件处理的实施者,由线程池从任务池中获取任务进行调度派发: group相当与工作组,按照任务的相关性对任务进行组织.
- thread.h
https://github.com/wookayin/pintos/blob/master/src/threads/thread.h #ifndef THREADS_THREAD_H #defi ...
- Dapper优秀资料
dapper extensions (predicates) https://www.cnblogs.com/starluck/p/4542370.html