Sql server 2008 每个CLR函数都需要一个过程?

Sql server 2008 每个CLR函数都需要一个过程?,sql-server-2008,sqlclr,Sql Server 2008,Sqlclr,我只是在SQL2008服务器上玩一下CLR程序集。我的第一个想法是:“太好了,现在我不需要添加25个存储过程和函数来让我的主存储过程可读。我只需要创建一个DLL并在其中添加所有需要的内容。” 因此,我刚刚尝试了MSDN中的一个简单HelloWorld示例,作为如何调用它的示例,我得到: CREATE PROCEDURE hello AS EXTERNAL NAME HelloWorld.Procedures.HelloWorld 这是在CLR程序集中调用函数的唯一方法吗?我想在不为类中的每个函

我只是在SQL2008服务器上玩一下CLR程序集。我的第一个想法是:“太好了,现在我不需要添加25个存储过程和函数来让我的主存储过程可读。我只需要创建一个DLL并在其中添加所有需要的内容。”

因此,我刚刚尝试了MSDN中的一个简单HelloWorld示例,作为如何调用它的示例,我得到:

CREATE PROCEDURE hello
AS
EXTERNAL NAME HelloWorld.Procedures.HelloWorld

这是在CLR程序集中调用函数的唯一方法吗?我想在不为类中的每个函数创建单个存储过程的情况下调用它。可能吗?

简单的回答,不!每个CLR存储过程和存储函数都需要一个具有适当外部名称的T-SQL存储过程或存储函数定义

是和否。这完全取决于你所说的“调用函数”是什么意思

如果您说的是直接从T-SQL调用方法,那么是的,每个公开的方法都需要一个T-SQL包装器对象作为两者(T-SQL和CLR)之间的桥梁。这个问题的解释是在@Mithrandir的回答中做出的

但是,如果您是从程序集中的私有/内部方法的角度讲的,那么不,这些方法不需要t-SQL包装器对象。本解释基于以下陈述:

我的第一个想法是:“太好了,现在我不需要添加25个存储过程和函数来让我的主存储过程可读。我只需要创建一个DLL并在其中添加所有需要的内容。”

这句话意味着我们希望有一些内部方法被公开的方法调用,这样就不会有太多的调用扰乱了主过程。公开的方法(即带有T-SQL包装器对象的方法)可以共享实用程序方法,甚至可以引用其他程序集,只要这些其他程序集是:

  • 在同一数据库中,以及
  • 具有相同的授权用户
这些实用程序方法仍然可以使用上下文连接进行数据访问,前提是它们是从暴露于T-SQL的方法调用的(即具有
SqlFunction
SqlProcedure
等属性和相应的T-SQL包装对象)


您甚至可以创建一个没有公开方法的程序集,并且只包含由其他程序集引用的代码。在这种情况下,您可以选择使用将
可见性
属性设置为
关闭
(无法通过
创建程序集
)。如果您
删除一个引用另一个程序集的程序集,而该程序集的
可见性设置为
OFF
,则不可见的程序集将自动删除,就像通过外键进行级联删除一样。

嗯,这不是我想要听到的答案,但我想这是正确的答案。我知道这已经有几年了,但我很好奇我在回答中是否正确地解释了你的问题。