【发布时间】: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