为什么我们要使用CLR存储过程?

3

为什么要使用CLR存储过程?CLR存储过程有哪些重要性或者只能使用CLR存储过程的例子吗?


1
CLR过程在哪里?在SQL Server中还是其他地方? - treaschf
参考这个吗?https://dev59.com/4HVD5IYBdhLWcg3wL4iM - icelava
5个回答

18

想象一下,你想使用正则表达式在SQL Server中验证一些数据字段。直到今天,在仅仅使用T-SQL代码的情况下,这几乎是不可能的,即使是在SQL Server 2008 R2中也是如此。

然而,借助CLR存储过程或存储函数的帮助,这将变得非常简单。

T-SQL在操作数据集方面非常强大 - 可以用它来实现这一点。

CLR在其他领域非常强大,比如字符串和日期操作,调用外部服务(WCF、Web服务)等。

因此,T-SQL存储过程和CLR存储过程是一个良好的互补 - 每个都解决了另一个不擅长的特定一组挑战。


请你能否举出一些从数据库调用Web API的例子? - Dinesh Kumar
1
@JugalPanchal:只需在Google或Bing上搜索-有许多使用SQL-CLR的扩展库,其中最著名的是SqlSharp - marc_s

2

有一些事情在SQL Server中无法完成(或在某些情况下不如托管代码好)。

  • CLR具有RegEx
  • 您可以调用Web服务。
  • CLR具有更好的性能(例如,如果您必须在每行上执行大量数学运算)
  • 代码重用
  • 使用您习惯的语言编写(VB.Net、C#等)。

2
我在类似问题的答案中发表了以下回答: SQL SERVER CLR的优点。 但是我要补充一下,因为至少有两个答案提到了这个问题:C# / VB.net /等语言比T-SQL更容易使用,不应该成为选择SQLCLR而不是T-SQL的原因。如果有人不知道如何在T-SQL中完成某些任务,请先寻求帮助以找到T-SQL解决方案。如果不存在,则可以考虑使用CLR方法。
SQLCLR / CLR 集成在 SQL Server 中只是帮助解决某些问题的另一个工具。它可以比纯 T-SQL 更好地完成一些任务,有些任务只能通过 SQLCLR 完成。我为 SQL Server Central 写了一篇文章 Stairway to SQLCLR Level 1: What is SQLCLR?(需要免费注册才能阅读文章),该文章回答了这个问题。基本情况如下(详细信息请参见链接的文章):
  • 流式表值函数(sTVF)
  • 动态SQL(在函数和触发器内部,可以访问 inserteddeleted 表)
  • 更好的访问外部资源/替换 xp_cmdshell
    • 更容易传入数据
    • 更容易获取结果集的多列
    • 没有外部依赖(例如 7zip.exe)
    • 通过模拟实现更好的安全性
  • 能够多线程处理
  • 错误处理(在函数内部)
  • 自定义聚合函数
  • 自定义类型
  • 修改状态(在函数内部且不使用 OPENQUERY / OPENROWSET
  • 执行存储过程(只读;在函数内部且不使用 OPENQUERY / OPENROWSET
  • 性能(注意:这并不是所有情况下都成立,但肯定在某些情况下取决于操作的类型和复杂性)
    • 计算/字符串操作
    • 如果 SQLCLR UDF 标记为 DataAccess = None,则可以在并行执行计划中使用,而 T-SQL UDF 则会阻止并行计划
  • 可以捕获输出(即发送到 SSMS 中的消息选项卡的内容)(例如,使用 PRINTRAISERROR 并且 severity = 0 到 10)-- 我在文章中忘记提到这个了 ;-)。
另外需要考虑的一件事是,有时候能够在应用程序和数据库之间共享代码是很有益的,这样数据库就可以了解某些业务逻辑,而无需构建仅用于访问该应用程序代码的定制内部屏幕。例如,我曾经在一个系统上工作过,该系统从客户导入数据文件并使用大多数字段的自定义哈希将该值保存到DB中的行中。这使得在再次导入其数据时轻松跳过行,因为应用程序会对输入文件中的值进行哈希,并将其与存储在行上的哈希值进行比较。如果它们相同,那么我们立即知道没有任何字段发生更改,所以我们转到下一行,这是一个简单的INT比较。但是,执行哈希的算法只存在于应用程序代码中,因此无论是为了调试客户案例还是寻找通过标记至少有一个字段发生更改的行来卸载一些处理到后端服务的方法(更改来自我们的应用程序而不是查找新导入文件中的更改),我都无能为力。这将是在DB中拥有一个相当简单的业务逻辑的绝佳机会,即使不是用于正常处理;在DB中具有相当于编码值的内容而无法理解其含义,这使得解决问题更加困难。
如果您有兴趣在不编写任何代码的情况下看到这些功能的一些演示,那么我所编写的SQL#的免费版本具有正则表达式函数、自定义聚合(UDAs)、自定义类型(UDTs)等功能。

0

如果你想:

  • 对数据执行复杂的操作,并且
  • 希望接近数据(即不在ASP.NET或Winforms应用程序中),并且
  • 您更喜欢用C#编写代码而不是SQL。

这种情况下,您可以使用CLR过程。我没有立即想到一个例子,但应该可以想象一个。

-- 编辑:

一个想象的例子可能是将数据转换为数据仓库类型结构。在这种情况下,您可能希望重新格式化并运行一些分析。然后可以在CLR中进行操作。(我不是在建议这正是我要做的事情,但可以考虑)。


0

如果您想进行一些非常规的数学计算,或者调用外部网络服务等操作,您无法在T-SQL中完成,这时候使用.NET存储过程或函数将会非常有帮助。

您还可以使用CLR过程编写聚合函数,这是T-SQL无法实现的。

当然,对于数据操作而言,T-SQL存储过程的性能更佳,编写也更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接