一、使用CLR表值函数的背景
在SQL SERVER里面,直接读取远程数据库的表,似乎会占用大量的内存,出现类似错误:
链接服务器 "192.168.0.1" 的 OLE DB 访问接口 "SQLNCLI10" 报错。提供程序内存不足。 [SQLSTATE 42000] (错误 7399) 。
我不知道读取远程数据库的表是一个什么样的原理,是首先从远程将该表一古脑全部加载到本地内存,然后再根据过滤条件来获得相应的记录,还是这个过滤在远程服务器完成,然后返回找到的记录?
从占用大量内存来看,我觉得应该是前者。
如果在远程数据库里面提供一个函数,获取什么记录,都通过这个函数,这样返回来的就是少量的记录,绝大部分的数据处理都已在远端完成,御敌于国门之外。
但是远程数据库的函数是不能直接使用的,会报“不允许使用远程表值函数调用。
”的错误。存储过程可以,函数不行。只能通过OPENQUERY的方式来完成调用。但是,OPENQUERY又不能传递参数。(详见
如何给OPENQUERY传递参数
)
变通的办法是,在本地写一个CLR的表值函数,由它负责去访问远程函数,而本地访问它,等于间接访问远程函数。
之所以用CLR表值函数,是比较好传递参数给OPENQUERY,并且获得返回记录后,又能够装配好返回给本地调用方。假如不是函数而是存储过程,我都不知道调用方怎么去获取到这些记录。
二、编写CLR表值函数
三、部署CLR表值函数
1、 代码编写完后,编译成DLL。然后打开SQL SERVER的目标数据库 --》程序集 --》添加程序集,将DLL导入。给该程序集起个名字,比如叫myClrDll
2、如果代码更改,重新编译成DLL,可以用以下语句重新导入
ALTER ASSEMBLY [myClrDll]
FROM 'd:\code\temp\myClrDll.dll'
注意'd:\code\temp\myClrDll.dll'一定是数据库所在机器的路径。通常我们程序和数据库不同机器,所以这个路径常常搞错。
3、创建数据库表值函数,以使用这个CLR表值函数
USE [mydb]
GO
CREATE FUNCTION [dbo].[cr_func_getdatabyId](@Id [int])
RETURNS TABLE (
[Id] [int] NULL,
[Name] [nvarchar](300) NULL,--VARCHAR不行,要用NVARCHAR
[CreateDate] [smalldatetime] NULL
) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [myClrDll].[myFunc].[GetDataById]
完成,从此您可以幸福地使用函数cr_func_getdatabyId鸟。
分享到:
相关推荐
SQL CLR表值函数是SQL Server 2005引入的一项创新功能,它允许开发者利用.NET Framework的强大力量来创建自定义的表生成逻辑。这项技术极大地扩展了SQL Server Reporting Services的数据访问能力,使得报告设计者能...
SQL Server CLR(Common Language Runtime)是微软SQL Server数据库引擎中的一个功能,允许开发人员使用.NET Framework的任何语言(如C#、VB.NET或F#)编写存储过程、触发器、用户定义函数(UDFs)、类型和其他...
必须SQLSERVER2005以上,支持CLR函数才行。 其中Concatenate是拼接字符串的聚合函数,MaxOther是某列最大时获取另外一列值的聚合函数,MinOther则反之。 Regex开头的函数是正则相关的函数。GetCodeTable是拆分字符串...
9. **Performance Improvements**: 使用CLR函数相比T-SQL,有时候能提高执行性能,尤其是对于复杂的数据处理和计算。 压缩包中的"SQLSysClrTypes.msi"文件是安装SQL Server System CLR Types的安装程序。在安装或...
标题提到的"SqlServer自定义多参数聚合函数实例代码"就是针对这种情况提供的一种解决方案。 自定义聚合函数通常通过两种方式实现:T-SQL(Transact-SQL)或CLR(Common Language Runtime)。T-SQL方式适用于简单的...
这些类型使得开发者能够使用.NET Framework的语言,如C#或Visual Basic .NET,来创建和操作SQL Server的对象,如存储过程、函数、触发器等。CLR集成是SQL Server的一个特性,允许将.NET代码嵌入到数据库中,从而扩展...
在SQL Server 2000中,表值函数主要通过Transact-SQL创建,而在SQL Server 2005及更高版本中,引入了对CLR(Common Language Runtime)的集成,允许使用.NET Framework的多种语言(如C#或Visual Basic .NET)来编写...
SQL Server提供了一种称为Common Language Runtime (CLR) 的功能,它允许使用.NET Framework的语言(如C#或VB.NET)编写存储过程、函数、触发器等数据库对象。在本篇文章中,我们将深入探讨如何利用SQL Server CLR...
SQL Server的CLR集成允许用户使用.NET编程语言(如C#或VB.NET)编写存储过程、触发器、函数等数据库对象。SQLSysClrTypes库则包含了处理这些对象所必需的类型和接口,例如,它可以处理空间数据类型,这对于地理信息...
- **部署与调用**:将编写的CLR函数注册到SQL Server数据库中,并通过标准的SQL查询调用这些函数。 #### 四、使用CLR编写触发器 - **触发器简介**:触发器是一种特殊的存储过程,当特定的事件发生时(如INSERT、...
本章将深入探讨如何利用CLR集成来创建自定义的存储过程、触发器、用户定义函数(UDF)、类型和表值函数等,以提升SQL Server的性能和灵活性。 1. CLR简介:CLR是Microsoft .NET Framework的核心部分,负责执行.NET...
CLR扩展DLL 在MS-SQL Server 环境中实现文件、目录操作,程序使用VS2010编写,语言Vb.net。运行起来飞一般的感觉! 包含文件、目录操作的常用20多个函数,支持网络访问文件。 我经过5~6年的使用,实现用SQL管理复杂...
在SQL Server中,CLR集成允许开发者使用.NET Framework的全部功能来编写存储过程、用户定义的函数、用户定义的类型、触发器和聚合函数。这样做的好处包括: 1. **性能提升**:对于需要大量计算的任务,使用CLR可以...
标签“systemclrtypes”和“sqlserver2012”进一步明确了该压缩包的内容,System CLR Types是与SQL Server 2012紧密相关的库。System CLR Types在SQL Server中扮演着重要角色,它提供了对SQL Server高级功能的支持,...
在"提高你的数据库编程效率_Microsoft CLR Via Sql Server"这个主题中,我们重点关注的是如何利用Microsoft Common Language Runtime (CLR)集成在SQL Server中,从而实现更高效、更灵活的数据库编程。 CLR是.NET ...
在SQL Server 2005中,通过集成.NET Framework的公共语言运行库(CLR),创建表值函数变得更加简单和强大。开发者可以用C#等编程语言编写函数,然后在SQL中调用,返回的结果可以直接作为一个表格。 在描述的场景中...
UDT是SQL Server中的一种自定义数据类型,通过CLR集成,开发人员可以创建复杂的数据结构,例如包含多个值或方法的对象,这些对象可以在数据库中直接存储和操作,提高了数据的封装和复用性。 **总结** SQL Server ...