代码之家  ›  专栏  ›  技术社区  ›  Anthony Potts

SQL Server CLR的优势

  •  12
  • Anthony Potts  · 技术社区  · 16 年前

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

    4 回复  |  直到 10 年前
        1
  •  17
  •   Joel Coehoorn    16 年前

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

        2
  •  8
  •   ConcernedOfTunbridgeWells    16 年前

    不同的目的。对于编写高度过程化的代码或使用T-SQL不可访问的系统工具的情况,clr存储过程非常有用。尽管没有固有的理由不能针对它编写应用程序存储过程,但一般来说,您不会将clr存储过程视为仅用于编写应用程序存储过程的另一种语言。通常,clr存储过程的大多数用途都是用于系统目的,而不是应用程序组件,尽管这绝不是一个硬性和快速的规则。

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

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

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

        3
  •  6
  •   marc_s HarisH Sharma    16 年前

    您还可以从sqlcr方法调用外部WebService-在T-SQL中不完全可行:-)

    马克

        4
  •  2
  •   Solomon Rutzky    10 年前

    SQL Server中的sqlcr/clr集成只是另一个帮助解决某些(不是全部)问题的工具。有一些事情比纯T-SQL更好,还有一些事情只能通过SQLCLR完成。我为SQL Server Central写了一篇文章, Stairway to SQLCLR Level 1: What is SQLCLR? (阅读文章需要免费注册),解决这个问题。基础知识包括(有关详细信息,请参阅相关文章):

    • 流表值函数(stvf)
    • 动态SQL(函数内)
    • 更好地访问外部资源/替换xp命令行程序
      • 传递数据更容易
      • 返回结果集的多列更容易
      • 无外部依赖项(例如7zip.exe)
      • 通过模拟提高安全性
    • 多线程能力
    • 错误处理(在函数内)
    • 自定义聚合
    • 自定义类型
    • 修改状态(在一个函数内且没有 OPENQUERY / OPENROWSET )
    • 执行存储过程(只读;在函数内且不在 开放查询 / OpenWROSET )
    • 性能(性能) 注: 这是 在所有情况下都有意义,但在某些情况下肯定取决于操作的类型和复杂性)
    • 可以捕获输出(即在SSMS中发送到消息选项卡的内容)(例如 PRINT RAISERROR 用一个 严重程度 =0到10)--我忘了在文章中提到这个;-)。

    另一个需要考虑的问题是,有时能够在应用程序和数据库之间共享代码是有益的,这样数据库就可以洞察某些业务逻辑,而无需构建自定义的、仅限内部的屏幕来访问该应用程序代码。例如,我曾在一个系统中工作过,该系统从客户导入数据文件,并使用大多数字段的自定义散列,并将该值保存到数据库中的行中。这允许在再次导入数据时轻松跳过行,因为应用程序将从输入文件散列值并与存储在该行上的散列值进行比较。如果它们是相同的,那么我们马上就知道所有字段都没有改变,所以我们继续下一行,这是一个简单的int比较。但是这个散列算法只存在于应用程序代码中,因此无论是用于调试客户案例还是通过标记至少有一个字段有更改的行(来自应用程序的更改,而不是在新导入文件中查找更改),我都无法将任何内容加载到后端服务中。o.这将是在数据库中有一个相当简单的业务逻辑的好机会,即使不是为了正常的处理;在数据库中有相当于一个编码值的值,并且没有能力理解它的含义,这使得解决问题变得非常困难。

    如果有兴趣在不需要编写任何代码的情况下看到这些功能中的某些功能,那么 SQL# (我是作者)有regex函数、自定义聚合(udas)、自定义类型(udts)等。