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