2009-01-13 60 views
12

SQLServer CLR比T-SQL有什么优势?使用.NET语法比T-SQL更容易吗?我看到你可以定义用户类型,但我不清楚为什么这样更好。例如,你可以定义一个电子邮件类型,它会有一个前缀属性和一个域属性。然后您可以搜索域或前缀或两者。但是,我没有看到与添加一个称为前缀和一个称为域的列几个列并分别搜索它们的方式有什么不同。也许有人有现实世界的原因,为什么这更好。SQL SERVER CLR的优势

+0

CLR使SSISDB部署,通过少RDP帐户,文件系统管理和少权的要求,里面的维护计划备份的继承,通过TDE全包加密从而大大提高了执行时间的评价,成功/失败/ ETA日志,安全,更不用说通过SSISDB的环境部分进行SSIS包部署和维护,以及SSIS中需要CLR的许多C#函数缺乏。如果您计划运行正确的SSIS部署或C#,则在创建SSISDB时需要启用CLR。 – 2016-01-01 01:45:46

回答

17

我举一个很好的例子:CLR有一个内置的RegEx对象,这在SQL Server中非常缺乏。现在编写函数来执行基于正则表达式的验证约束/修复是微不足道的。

+0

如果你知道一个例子,我会喜欢这样一个例子的链接。 – 2009-01-13 17:19:32

+2

http://weblogs.sqlteam.com/jeffs/archive/2007/04/27/SQL-2005-Regular-Expression-Replace.aspx – 2009-01-13 17:21:40

8

不同的目的。 CLR存储过程对于编写高度程序化代码或使用不能从T-SQL访问的系统设施将会有所帮助。尽管没有固有的理由不能写应用程序,但通常不会将CLR sprocs视为一种用于编写应用程序sprocs的不同语言。通常,CLR sproc的大多数用途都是为了系统目的而不是应用程序组件,尽管这并不是一条坚强而快速的规则。

CLR集成层的确提供了一些不能从T-SQL存储过程直接获得的功能,例如自定义聚合函数。它还提供对.Net库的访问,这对于访问T-SQL无法支持的功能可能很有用。

T-SQL做传统的数据库的东西,并与查询优化器集成,所以它仍然是最适合面向集合的数据库代码。为CLR sprocs提供了API钩子以向查询优化器提供信息,但这增加了一些复杂性。

也可以使用CLR集成来定义可供T-SQL代码访问的函数。在某些情况下,这些可能比T-SQL函数更快,更有效。 Wrox press book on CLR integration在一定程度上对此进行了讨论。

6

你也可以例如从SQLCLR方法调用外部web服务 - 不完全可能在T-SQL :-)

马克

2

SQLCLR /内SQL Server CLR集成仅仅是另一种工具来帮助解决某些(不是全部)问题。有几件事比它在纯T-SQL中可以做得更好,并且有些事情只能通过SQLCLR完成。我为SQL Server Central写了一篇文章,Stairway to SQLCLR Level 1: What is SQLCLR?(需要免费注册才能阅读那里的文章),解决了这个问题。基本要点有(详见链接的文章):

  • 流表值函数(sTVF)
  • 动态SQL(函数内)对外部资源的
  • 更好的访问/替换xp_cmdshell的
    • 传递数据更容易
    • 获取结果集的多个列更容易
    • 没有外部依赖关系(例如7zip。通过模拟
    • EXE)
    • 更好的安全性
  • 能够多线程
  • 错误处理(函数内)
  • 自定义聚集
  • 自定义类型
  • 修改国家(函数内部和外部OPENQUERY/OPENROWSET
  • 执行存储过程(只读;一个函数内并且没有OPENQUERY/OPENROWSET
  • 性能(注:这是在所有情况下意义,但肯定是在某些情况下,根据操作的类型和复杂性)
  • 可以捕获输出(即什么被发送到在SSMS邮件选项卡)(例如PRINTRAISERROR严重性 = 0〜10) - I忘记提到这一个文章;-)英寸

另一个要考虑的是,有时是有益的是能够在应用程序和数据库之间共享代码,以便DB具有洞察一定的业务逻辑,而不必构建自定义,仅供内部使用的屏幕只是访问该应用程序代码。例如,我曾参与过一个系统,该系统从客户导入数据文件,并使用大多数字段的自定义散列并将该值保存到数据库中的行中。这允许在再次导入数据时轻松地跳过行,因为应用程序会对输入文件中的值进行散列并与存储在行中的散列值进行比较。如果它们相同,那么我们立即就知道没有任何字段发生了变化,所以我们进入下一行,这是一个简单的INT比较。但是,执行哈希的算法仅适用于应用程序代码,因此无论是调试客户案例还是通过标记具有至少一个包含更改字段的行(从我们的应用程序发出更改)来查找将某些处理卸载到后端服务的方法而不是在新的导入文件中寻找更改),我无能为力。这对于在DB中拥有相当简单的业务逻辑来说是一个很好的机会,即使不是用于正常处理;在数据库中具有相当于编码值的数据而无法理解其含义使解决问题变得非常困难。

如果您有兴趣看到其中一些功能无需编写任何代码,则免费版SQL#(我是其作者)具有RegEx函数,自定义聚合(UDA),自定义类型(UDT),等