【问题标题】:How to execute SQLCLR UDF added directly to SSDT sqlproj and resolve reference error SQL71501如何执行直接添加到 SSDT sqlproj 的 SQLCLR UDF 并解决引用错误 SQL71501
【发布时间】:2012-05-24 17:45:29
【问题描述】:

我一直试图找到这个简单问题的答案 - 但到目前为止还没有弄清楚。

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

我已经通过Add->New item -> SQL CLR C#, User Defined Function 添加了一个新的UDF。

例如:

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 Properties 中,SQLCLR 选项卡 MyDb 是程序集的名称和默认命名空间

在我的 sql 代码中,我使用 EXTERNAL NAME 调用 clr 方法:

CREATE PROCEDURE ClrMethod1
  RETURNS [int] WITH EXECUTE AS CALLER
AS EXTERNAL NAME [MyDb].[MyNamespace.MyClass].[Method1]

我似乎尝试了一切来编译最后一行。它无法解析引用并获取:

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

请指出正确的方法来让它工作。我可能会错过什么?

我正在使用 VS2010 SP1 和最新版本的 SSDT

【问题讨论】:

  • 在意识到您的 *.cs 文件实际上在您的 SSDT 项目中后,我更新了我的帖子。希望对您有所帮助。
  • 这实际上有点棒,因为直到我刚刚尝试过,我才意识到 SSDT 项目可以编译 CS。我正要全力以赴,就像“SSDT 项目不编译 CS 文件!你甚至可以查看构建输出并查看”......哦等等它实际上正在生成一个 DLL,我打开它在.net反射器中,果然有新的CLR函数:D我不确定项目重命名如何影响程序集名称。 .NET Reflector 可用于稍后检查生成的 DLL 的程序集名称(在 Project/Obj/Debug/ 文件夹下)
  • 没关系,在项目属性->SQLCLR->程序集名称下找到
  • 是的,这是 sqlproj 的一个简洁功能! SQLCLR 现在是数据库项目的一部分 - 实际上就是这样。

标签: c# sql sql-server-2008-r2 sqlclr


【解决方案1】:

您必须添加包含 CLR 代码的已编译 DLL 作为参考。所以在你的 MyDb SSDT 项目下->References(右键单击)->Add Reference,浏览到 DLL。

如果您在同一个解决方案中有 CLR(类库)项目,您可能会通过引用项目而不是 DLL 而侥幸,但在我的情况下,我引用的是 DLL(为单独的解决方案编译)。

AS EXTERNAL NAME这一行的格式而言:

AS EXTERNAL NAME [AssemblyName].[ClassName].[FunctionName]

注意:对于 CLR 对象,我从我的类/代码周围删除命名空间只是为了简化事情,因为这一步通常是最有问题的。 AssmeblyName/DLL Name/Namespace 很容易混淆。通过访问 Project Properties->Application->"Assembly Name:",可以在 CLR 类库项目中找到 AssemblyName。我会从中删除任何非字母数字/空格,只是为了简化名称并排除这是一个问题。

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


好吧,您意识到您实际上在同一个 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]

这是为我编译的。 注意:再次没有使用命名空间。当我添加新项目时...生成的代码没有命名空间。

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2019-01-04
    相关资源
    最近更新 更多