【问题标题】:SQL 71501 has an unresolved assembly referenceSQL 71501 有一个未解析的程序集引用
【发布时间】:2017-04-24 15:41:48
【问题描述】:

我们在 Visual Studio 2015 和目标平台设置为 SQL Server 2008 的情况下使用 SSDT 工具。我们被这个函数卡住了,它抛出了一个错误,需要帮助来解决它。

 SQL71501: Function: [dbo].[GetFormattedAddress] has an unresolved reference to Assembly [AddressFormatting]


 CREATE FUNCTION [dbo].[GetFormattedAddress]
 (@AddressID INT, @CompleteAddress BIT)
RETURNS NVARCHAR (4000)
AS
EXTERNAL NAME [AddressFormatting].[AddressFormatting.UserDefinedFunctions].[GetFormattedAddress]

GO

--更新

在 Assemblies 文件夹下,对于 AddressFormatting.dll,我将 BuildAction 设置为 Build,然后在 References 下我设法看到了我现在设置为 True 的 Model Aware 属性。在此之后,现在我收到以下错误:

SQL46010: 附近的语法不正确

指向错误的文件是 AddressFormatting.dll

【问题讨论】:

  • 消息是否正确?您是否先部署了程序集
  • SSDT 创建适当的脚本来部署程序集和函数。您是如何部署代码的?
  • 什么意思?我们刚刚从现有数据库中导入了项目,这个功能就是这样。它在程序集文件夹下创建了一个程序集。我已将该程序集作为参考导入到我的项目中,但错误仍然相同。
  • 我没有在任何地方部署程序集。我需要在哪里部署程序集?
  • 程序集必须作为 SQL 对象存在于您的项目中,就像您的函数和表一样。

标签: sql-server visual-studio-2015 sql-server-data-tools sqlclr


【解决方案1】:

这个问题完全在 SSDT 中,与模式或将程序集加载到 GAC 无关(在问题的 cmets 中都提到了这两者)。出于某种原因,即使您将程序集从 SQL Server 带到您的项目中,SSDT 也没有看到它。您在评论中提到您“将该程序集作为我的项目中的参考导入”,但这可能应该像在我的测试中那样自动发生。

您需要转到“解决方案资源管理器”中的“参考”文件夹并将装配的“模型感知”属性更改为“真”(此步骤解决了此 S.O. 问题中的相同错误:How to resolve VS2013 Error SQL71501: Procedure X has an unresolved reference to Assembly Y?)。如果您手动添加引用,“Model Aware”可能默认为“False”。

我能够通过导入项目(“模型感知”设置已设置为“真”)并将其设置为“假”以获取错误并返回“真”来重现此错误(和修复)删除错误。


此外,如果由于某种原因您确实遇到了该错误并且“正确”设置似乎不起作用,即使在执行“清洁解决方案”、“重建解决方案”甚至关闭并重新启动 Visual 之后Studio,那么您需要删除 $(ProjectDir)\project_name.dbmdl 文件。为了删除该文件,该项目无法在 Visual Studio 中打开,因为它将被 Visual Studio 锁定。或者,您可以转到项目属性,然后在“项目设置”选项卡上,将“目标平台”更改为另一个版本,然后返回原来的版本(类似于其他答案中描述的内容,但不需要在将其翻转回原始版本之前进行“构建”或“重建”),因为这具有删除该 .dbmdl 文件的副作用。

请注意,.dbmdl 文件在项目关闭之前不会被写入。因此,如果您第一次打开项目时该文件不存在,或者如果您切换了“目标平台”,那么您将不会看到 .dbmdl 文件,直到您关闭解决方案、卸载项目,或退出 Visual Studio。执行“全部保存”不会将此文件写入磁盘!

【讨论】:

  • 该项目已作为现有项目添加到自动创建的名为 assembly 的文件夹下。 Model Aware 的第二个选项,我似乎找不到 Model Aware 属性,并且在提问之前做了那个特定的帖子。在程序集的属性中,我看到的只是“构建操作”、“复制到输出目录”、“文件名”和“完整路径”。我正在使用具有 SQL 2008 兼容性的 VS 2015,但不确定这是否与为什么现在显示此属性有关?
  • @user1490835 抱歉,我周末没能做到这一点。我看到您的更新,并且“模型感知”选项位于“参考”区域,而不是“组件”文件夹中。我刚刚进行了导入,并且看到了同样的情况。我还看到其他人回答了,它似乎对你有用。这很好,但我对实际原因有些疑虑,因为“目标平台”设置只控制生成的部署脚本,没有别的。我知道实际问题是什么,但我自己无法重现。这是你可以复制的东西吗?
  • 我从头开始用 sql 项目创建了一个新的解决方案,它根本没有任何问题。一切都很好,但模型感知属性被自动设置为 true,这又很奇怪。我不确定我应该如何尝试重现该错误......我给了你赏金,因为它可能是你的步骤解决了这个问题?可能只需要重新启动视觉工作室或类似的东西?
  • @user1490835 感谢您的赏金,希望我应得的 ;-)。我也许可以重现它。我将导入的 DLL 的“构建操作”更改为“构建”,执行“构建解决方案”,并得到与您更新问题时相同的 SQL46010: Incorrect syntax near {box} 错误。我将“构建操作”改回“无”并执行了“清理”和“重建”,但无法摆脱该错误(它在 obj\{configuration_name} 文件夹中创建了一个无效程序集。(续...)
  • @user1490835 然后我将“参考”中装配体上的“模型感知”更改为“假”,并得到了与您最初报告的相同的 SQL71501: Function: [X].[Y] has an unresolved reference to Assembly [Z] 错误。然后我将“Model Aware”改回“True”,“SQL71501”错误消失,留下“SQL46010”错误。我将擦除对象并重新导入以找出“为什么”。我认为 .sqlproj 文件变得混乱,无法通过 UI 中的更改来修复。我在项目中没有任何 .NET 文件,所以我不知道它是从什么编译 DLL 的;-)。然而……
【解决方案2】:

我也遇到了这个问题,通过将 Visual Studio 中的 SQL 兼容级别更改为 2012,重新编译项目,然后将其更改回 2008 的兼容级别,然后执行一个干净的项目,然后重新编译,神秘地解决了这个问题。

【讨论】:

  • 你好。很棒的信息,虽然非常混乱。我不会争辩说它有效,因为您看到它确实有效,OP 接受了它,但我无法重现这一点,并且所采取的行动,至少在表面上,不应该在重写之外做任何事情部署 SQL 脚本,这不应该导致该错误。 “目标平台”仅更改为部署脚本生成的 SQL,与 DLL 本身没有任何关系。如果可能的话,如果您不介意的话,我想了解实际原因:-)。你能重现这个,还是一次性的?
  • @srutzky:如果可以的话,我会尝试复制它并回复你。仅供参考,我确实也执行了您提到的所有步骤,并且可能是解决此问题的多种方法的组合。如果可以的话,我会尝试复制它,然后给你确切的步骤。感谢您的所有帮助。
  • @user1490835 和 user3468420:我想通了。将“目标平台”更改为 2012,然后更改为 2008 有效(并且不需要在设置为 2012 时进行重建),但这仅仅是因为更改目标平台的作用:它删除了 $ProjectDir\project_name.dbmdl 文件!当项目当前未在 Visual Studio 中加载时,可以手动完成。
猜你喜欢
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2012-04-23
相关资源
最近更新 更多