SQL71501 有未解析的程序集引用

SQL 71501 has an unresolved assembly reference

我们正在使用 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 中,与模式或将程序集加载到 GAC 无关(这两个问题都在问题的评论中提到)。出于某种原因,即使您将程序集从 SQL 服务器带到您的项目中,SSDT 也看不到它。您在对问题的评论中提到您 "imported that assembly as a reference in my project",但这可能应该像在我的测试中那样自动发生。

您需要转到 "Solution Explorer" 中的 "References" 文件夹,并将 "Model Aware" 属性 更改为 "True" 以进行组装(此步骤解决了在这个 S.O. 问题中同样的错误:How to resolve VS2013 Error SQL71501: Procedure X has an unresolved reference to Assembly Y?)。如果您手动添加引用,"Model Aware" 可能默认为 "False".

我能够通过导入项目("Model Aware" 设置已设置为 "True")重现此错误(和修复)并将其设置为 "False" 以获取错误并返回 "True" 以删除错误。


此外,如果由于某种原因您确实遇到了该错误并且 "proper" 设置似乎不起作用,即使在执行了 "Clean Solution"、"Rebuild Solution" 和即使关闭并重新启动 Visual Studio,则需要删除 $(ProjectDir)\project_name.dbmdl 文件。为了删除该文件,项目无法在 Visual Studio 中打开,因为它将被 Visual Studio 锁定。或者,您可以转到项目属性,然后在 "Project Settings" 选项卡上,将 "Target platform" 更改为另一个版本,然后再恢复为原来的状态(类似于其他答案中描述的内容,但有在将其翻转回原始版本之前无需执行 "build" 或 "rebuild"),因为这会产生删除 .dbmdl 文件的副作用。

请注意,.dbmdl 文件只有在项目关闭后才会被写入。因此,如果您第一次打开项目时该文件不存在,或者如果您切换 "Target platform",那么在您关闭之前您将看不到 .dbmdl 文件解决方案、卸载项目或退出 Visual Studio。执行 "Save All" 不会将此文件写入磁盘!

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