C# 如何执行直接添加到SSDT sqlproj的SQLCLR UDF并解决引用错误SQL71501

C# 如何执行直接添加到SSDT sqlproj的SQLCLR UDF并解决引用错误SQL71501,c#,sql,sql-server-2008-r2,sqlclr,C#,Sql,Sql Server 2008 R2,Sqlclr,我一直在试图找到这个简单问题的答案,但到目前为止还没有找到答案 假设我有MyDb.sqlproj,其中包含各种sql内容(存储过程、视图、触发器等) 我通过添加->新建项->SQL CLR C#,用户定义函数添加了一个新的自定义项 例如: namespace MyNameSpace { public class MyClass { [SqlFunction(DataAccess = DataAccessKind.Read)] //I use different attribu

我一直在试图找到这个简单问题的答案,但到目前为止还没有找到答案

假设我有MyDb.sqlproj,其中包含各种sql内容(存储过程、视图、触发器等)

我通过添加->新建项->SQL CLR C#,用户定义函数添加了一个新的自定义项

例如:

namespace MyNameSpace
{
 public class MyClass
 {
    [SqlFunction(DataAccess = DataAccessKind.Read)]
    //I use different attributes here, but it doesn't matter
    public static int Method1()
    {
       return 0;
    }
 }
}
在MyDb.sqlproj属性中,SQLCLR tab MyDb是程序集和默认命名空间的名称

在我的sql代码中,我使用外部名称调用clr方法:

CREATE PROCEDURE ClrMethod1
  RETURNS [int] WITH EXECUTE AS CALLER
AS EXTERNAL NAME [MyDb].[MyNamespace.MyClass].[Method1]
我似乎想尽一切办法来编译最后一行。它无法解析引用并获取:

SQL71501:函数:[我的sql函数的名称]具有未解析的 对程序集的引用[MyDb]

请告诉我正确的方法让它工作。我会错过什么


我使用的是VS2010 SP1和最新版本的SSDT,您必须添加包含CLR代码的编译DLL作为参考。因此,在MyDb SSDT项目->引用(右键单击)->添加引用下,浏览到DLL

如果在同一个解决方案中有CLR(类库)项目,您可能不需要引用该项目而不用DLL,但在我的例子中,我引用的是DLL(为单独的解决方案编译)

至于
作为外部名称的格式
行:

作为外部名称[AssemblyName].[ClassName].[FunctionName]

注意:对于CLR对象,我从类/代码中删除名称空间只是为了简化事情,因为这一步通常是最有问题的。很容易混淆AssmeblyName/DLL名称/命名空间。通过访问项目属性->应用程序->“程序集名称:”,可以在CLR类库项目中找到程序集名称。我会从中删除任何非字母数字/空格,只是为了简化名称并排除这一问题

所以我会尝试一下,一旦你开始工作了,如果你真的想要名称空间,那么你可以添加名称空间并从中找出语法,至少你知道其他部分是正确的


好的,在同一个SSDT项目中有一个*.cs文件。因此,在这种情况下,如果您的代码是:

CS文件:

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString SqlFunction1()
    {
        // Put your code here
        return new SqlString (string.Empty);
    }
}
SQL文件:

CREATE PROCEDURE ClrMethod1
  RETURNS [int] WITH EXECUTE AS CALLER
AS EXTERNAL NAME [MyDB].[UserDefinedFunctions].[SqlFunction1]

这是为我编写的注意:同样没有使用名称空间。当我添加新项目时。。。生成的代码没有名称空间。

我在意识到你的*.cs文件实际上在你的SSDT项目中后更新了我的帖子。希望这能帮到你。这实际上是一个很棒的原因,直到我刚刚尝试,我才意识到SSDT项目可以编译CS。我正准备全力以赴,就像“SSDT项目不编译CS文件!你甚至可以查看构建输出,然后看到”。。。哦,等等,它实际上正在生成一个DLL,我在.net reflector中打开了它,果然有了新的CLR函数:D我不确定项目重命名会如何影响程序集名称。NET Reflector可用于检查生成的DLL的程序集名称(如果需要)(在Project/Obj/Debug/folder下)Nevermind下,可以在Project Properties->SQLCLR->assembly name下找到。是的,这是sqlproj的一个整洁特性!SQLCLR现在是数据库项目的一部分——事实上就是这样。