Sql server SQL SERVER CLR的优势

Sql server SQL SERVER CLR的优势,sql-server,clr,sqlclr,Sql Server,Clr,Sqlclr,SQLServerCLR与T-SQL相比有哪些优势?使用.NET语法比T-SQL容易吗?我知道你可以定义用户类型,但我不太清楚为什么这样更好。例如,您可以定义电子邮件类型,它将具有前缀属性和域属性。然后,您可以搜索域或前缀或两者。然而,我看不出这与添加两列(一个称为prefix,一个称为domain)并分别搜索它们有什么不同。也许有人有现实世界的原因来解释为什么这样更好。不同的目的。CLR存储过程对于编写高度过程化的代码或使用无法从T-SQL访问的系统功能会有好处的情况非常有用。虽然没有内在的原

SQLServerCLR与T-SQL相比有哪些优势?使用.NET语法比T-SQL容易吗?我知道你可以定义用户类型,但我不太清楚为什么这样更好。例如,您可以定义电子邮件类型,它将具有前缀属性和域属性。然后,您可以搜索域或前缀或两者。然而,我看不出这与添加两列(一个称为prefix,一个称为domain)并分别搜索它们有什么不同。也许有人有现实世界的原因来解释为什么这样更好。

不同的目的。CLR存储过程对于编写高度过程化的代码或使用无法从T-SQL访问的系统功能会有好处的情况非常有用。虽然没有内在的原因可以解释为什么不能针对它编写应用程序存储过程,但一般来说,您不会将CLR存储过程仅仅视为编写应用程序存储过程的另一种语言。通常,CLR存储过程的大多数用途都是用于系统目的,而不是应用程序组件,尽管这绝非硬性规定

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

T-SQL做传统的数据库工作,并与查询优化器集成,所以它仍然最适合面向集合的数据库代码。CLR存储过程有API钩子,可以向查询优化程序提供信息,但这增加了一些复杂性


还可以使用CLR集成来定义T-SQL代码可以访问的函数。在某些情况下,这些函数比T-SQL函数更快、内存效率更高。本文对此进行了深入的讨论。

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

您也可以从SQLCLR方法调用外部Web服务(在T-SQL中不完全可能:-)


Marc

SQL Server中的SQLCLR/CLR集成只是帮助解决某些(并非所有)问题的另一个工具。有一些事情它比纯T-SQL做得更好,还有一些事情只能通过SQLCLR来完成。我为SQLServerCentral写了一篇文章(在那里阅读文章需要免费注册),解决了这个问题。基本内容包括(有关详细信息,请参阅链接文章):

  • 流表值函数(sTVF)
  • 动态SQL(函数内)
  • 更好地访问外部资源/Replace xp\u cmdshell
    • 传递数据更容易
    • 返回结果集的多个列更容易
    • 无外部依赖项(例如7zip.exe)
    • 通过模拟提高安全性
  • 多线程处理能力
  • 错误处理(函数内)
  • 自定义聚合
  • 自定义类型
  • 修改状态(在函数内且不带
    OPENQUERY
    /
    OPENROWSET
  • 执行存储过程(只读;在函数内且不带
    OPENQUERY
    /
    OPENROWSET
  • 性能(注意:这并不是指所有情况,但在某些情况下,这取决于操作的类型和复杂性)
  • 可以捕获输出(即发送到SSMS中Messages选项卡的内容)(例如,
    打印
    RAISERROR
    ,严重性为0到10)--我忘了在文章中提到这个;-)

另一件需要考虑的事情是,有时在应用程序和数据库之间共享代码是有益的,这样数据库就可以了解某些业务逻辑,而不必为了访问应用程序代码而定制定制的内部屏幕。例如,我曾在一个系统上工作,该系统从客户导入数据文件,并使用大多数字段的自定义哈希,然后将该值保存到数据库中的行中。这使得在再次导入数据时可以轻松跳过行,因为应用程序将对输入文件中的值进行散列,并与存储在行中的散列值进行比较。如果它们是相同的,那么我们立刻知道所有字段都没有改变,所以我们进入下一行,这是一个简单的INT比较。但进行哈希运算的算法仅存在于应用程序代码中,因此无论是为了调试客户案例,还是为了寻找通过标记至少有一个字段有更改的行(更改来自我们的应用程序,而不是在较新的导入文件中查找更改)来将某些处理转移到后端服务的方法,我无能为力。这将是一个很好的机会,在数据库中有一个相当简单的业务逻辑位,即使不是正常的处理;在数据库中有一个编码值,但无法理解其含义,这使得解决问题变得非常困难


如果有兴趣在不必编写任何代码的情况下看到这些功能中的某些功能,免费版本(我是其作者)具有正则表达式函数、自定义聚合(UDA)、自定义类型(UDT)等。

我希望有一个指向此类示例的链接,如果你知道的话。将对外部服务的阻塞调用放入数据库代码中,该外部服务可能可用,也可能不可用。。“可能会出什么问题?”ConcernedOfTunbridgeWells说,这并不像大多数人所认为的那样阻碍。SQL Server和CLR如何协同工作部分的状态(稍加编辑):“.NET代码在SQL Server中以抢占方式运行。SQL Server可以检测并停止在相当长一段时间内未生成的线程。SQL Server可以识别“失控”“CLR线程,管理它们的优先级,并将它们挂起并放回队列。重复标识为失控的线程在给定的时间段内不允许运行。“CLR