SQLServer CLR比T-SQL有什么优势?使用.NET语法比T-SQL更容易吗?我看到你可以定义用户类型,但我不清楚为什么那样更好。例如,您可以定义电子邮件类型,它将具有前缀属性和域属性。然后,您可以搜索域或前缀或两者。但是,我没有看到与添加一个名为prefix的列和一个名为domain并且单独搜索它们的列有什么不同。也许某人有现实世界的理由为什么这会更好。
答案 0 :(得分:17)
我将给出一个很好的例子:CLR有一个内置的RegEx对象,它在SQL Server中非常缺乏。现在编写函数来执行基于正则表达式的验证约束/修复是微不足道的。
答案 1 :(得分:8)
不同的目的。 CLR存储过程对于编写高度过程代码或使用无法从T-SQL访问的系统工具有益的事情非常有用。虽然没有固有的原因导致人们无法编写应用程序sprocs,但通常你不会将CLR sprocs视为编写应用程序sprocs的另一种语言。通常,CLR sproc的大多数用途都是出于系统目的而不是应用程序组件,尽管这绝不是一个严格的规则。
CLR集成层确实提供了一些不能直接从T-SQL存储过程中获得的工具,例如自定义聚合函数。它还提供对.Net库的访问,这对于访问T-SQL不支持的功能可能很有用。
T-SQL做传统的数据库工作,并与查询优化器集成,因此它仍然最适合面向集合的数据库代码。 CLR sprocs有API钩子来为查询优化器提供信息,但这增加了一些复杂性。
还可以使用CLR集成来定义T-SQL代码可访问的函数。在某些情况下,这些比T-SQL函数更快,内存效率更高。 Wrox press book on CLR integration深入讨论了这一点。
答案 2 :(得分:6)
你也可以,例如从SQLCLR方法调用外部Web服务 - 在T-SQL中不完全可能: - )
马克
答案 3 :(得分:2)
SQL Server中的SQLCLR / CLR集成只是帮助解决某些(并非所有)问题的另一种工具。有一些事情比纯T-SQL可以做的更好,有些事情只能通过SQLCLR完成。我为SQL Server Central撰写了一篇文章Stairway to SQLCLR Level 1: What is SQLCLR?(需要免费注册才能阅读那里的文章),这篇文章解决了这个问题。基础知识(详见链接文章):
OPENQUERY
/ OPENROWSET
)OPENQUERY
/ OPENROWSET
)PRINT
和RAISERROR
严重性 = 0到10) - 我忘了在文章中提到这个; - )。另外需要考虑的是,有时能够在应用程序和数据库之间共享代码是有益的,这样数据库就可以深入了解某些业务逻辑,而无需构建自定义的仅限内部的屏幕来访问应用代码。例如,我参与了一个从客户导入数据文件并使用大多数字段的自定义哈希并将该值保存到数据库中的行的系统。这允许在再次导入其数据时轻松地跳过行,因为应用程序将对输入文件中的值进行散列并与存储在行上的散列值进行比较。如果它们是相同的,那么我们立即知道没有任何字段发生变化,所以我们进入下一行,这是一个简单的INT比较。但是,用于执行哈希的算法仅在应用程序代码中,因此无论是调试客户案例还是通过标记具有至少一个具有更改的字段的行(来自我们的应用程序的更改)来寻找将一些处理卸载到后端服务的方法与在较新的导入文件中查找更改相反,我无能为力。即使不是正常处理,这也是在DB中拥有相当简单的业务逻辑的好机会;如果数据库中的编码值无法理解其含义,那么解决问题将非常困难。
如果有兴趣在不必编写任何代码的情况下看到其中的一些功能,SQL#的免费版本(我是作者)具有RegEx函数,自定义聚合(UDA),自定义类型( UDT)等。