我们什么时候需要 SQL 服务器中的 CLR 函数?

When do we need a CLR function in SQL Server?

我想知道什么时候需要在 SQL 服务器中使用 CLR 函数。

Some says that CLR is mainly used to accomplish task which are not possible by T-SQL. But I can't figure out a good example for T-SQL failed to give me my exact output.

有人能给我一个无法通过 T-SQL 完成的确切示例吗?

样品将不胜感激!

问什么时候SQLCLR 需要是错误的思考方式。与大多数其他技术一样,这是完成某些任务 and/or 解决某些问题的一种方法,但总有变通方法。真正的问题是什么时候使用 SQLCLR 合适 来解决特定问题。从这个意义上说,有一些事情在 SQLCLR 中更容易完成,或者在 T-SQL.

中根本无法完成。

我在下面的文章 Stairway to SQLCLR Level 1: What is SQLCLR? 中发布了一份相当全面的 SQLCLR 功能列表(需要免费注册)。由于该站点需要注册,甚至是免费注册,因此我已在下面复制了该列表。有关每一点的更详细解释和一些其他信息,请参阅该链接文章。

只能在 SQLCLR

中完成
  • Streaming Table-Valued Functions (sTVF)(见最后的文章链接)
  • 函数(标量或 TVF)中的动态 SQL
  • / 替换 xp_cmdshell:
    • 传入数据更容易
    • 取回结果集的多列更容易
    • 无外部依赖
    • 可以使用模拟
  • 多线程
  • 函数中的错误处理(标量或 TVF)
  • Custom Aggregates (User-Defined Aggregates / UDAs)(文章链接见文末)
  • 自定义类型(用户定义类型/UDT)
  • Capture Messages (PRINT / RAISERROR(.., 10, 1) output)
  • Participate in Parallel Plans(标量函数)
  • Share / Cache Memory Across Sessions
  • 设置持久环境变量

在 SQLCLR

中更容易
  • 生成 GUID
  • 生成一个随机数
  • 修改状态
  • 执行存储过程(在函数中——标量或 TVF——但它必须是只读的)

性能

比较 T-SQL 和 CLR 对象之间的性能是一个更复杂的话题。首先,您实际上只能比较它们之间相同的功能。然后你必须考虑正在完成的逻辑类型,如果比较功能,是否在两种类型的代码中有效地完成了逻辑 是通过 SET 语句还是多行查询等 运行。

Microsoft 有一些准则 (Performance of CLR Integration) 说明哪些情况更适合基于 CLR 的对象。如果您将使用 SQLCLR 对象,那么您至少应该了解该信息。然而,这一切都归结为测试,而这一切都是可测试的。我在 2011 年 7 月对这个主题做了一些研究, 在这里发表我的发现:https://www.simple-talk.com/sql/t-sql-programming/clr-performance-testing/.

例子

可以做的事情有很多例子,例如:

  • 正则表达式
  • 文件系统函数
  • 网络/网络/网络服务相关
  • 字符串拆分
  • 自定义聚合
  • 导出数据
  • 等等...

有关可以完成的事情的更全面列表,请查看 SQL# 库(我是它的作者),它有一个免费版本,带有 RegEx 函数等等。还有一个付费/完整版,具有额外的文件系统、网络等功能。

SQL Server Central(需要免费注册的站点)上各种文章中的其他示例: