2016-12-09 119 views
5

我们正在使用SSDT工具,将Visual Studio 2015和目标平台设置为SQL Server 2008.我们坚持使用这个函数,该函数抛出一个错误,并且需要帮助我们可以做些什么来修复它。SQL 71501有一个未解决的程序集参考

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 

--update

在大会文件夹,AddressFormatting.dll,我设置BuildAction的建设,然后参考下我设法看到我现在已经设置为True模型感知特性。在此之后,现在我得到以下错误:

SQL46010:近enter image description here

的文件,其中它的指向误差AddressFormatting.dll

+0

任何机会的消息是正确的?你是否首先部署了*程序集? –

+0

SSDT创建适当的脚本来部署程序集和函数。你是如何部署你的代码的? –

+0

你是什么意思?我们只是从现有的数据库导入项目,并且这个功能是原样的。它在assembly文件夹下创建了一个程序集。我在我的项目中导入了该程序集作为参考,但错误仍然相同。 – Baahubali

回答

3

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

+0

嘿。伟大的信息,虽然高度混淆。我不会认为它是有效的,因为你看到它做到了,OP接受了它,但我不能重现这一点,至少在肤浅层面上采取的行动不应该在重写部署SQL脚本,这不应该导致该错误。 “目标平台”仅更改为部署脚本生成的SQL,而不是与DLL本身有关的任何内容。如果可能的话,我想找到真正的原因,如果你不介意:-)。你能重现吗?或者它是一次性的东西? –

+0

@srutzky:我会尽力重现它,如果可以的话还给你。只是为了获取信息,我确实执行了您提到的所有步骤,它可能是解决此问题的组合。我会尝试复制它,然后给我确切的步骤,如果我可以。感谢您的所有帮助。 – Baahubali

+0

@ user1490835和user3468420:我想通了。将“目标平台”更改为2012年,然后更改为2008年(不需要重建),但仅限于更改目标平台的操作:它会删除** $ ProjectDir \ project_name.dbmdl * *文件!当项目当前不在Visual Studio中加载时,可以手动完成。 –

1

这个问题是完全在SSDT,并没有任何不正确的语法模式或将组件加载到GAC中(这两个都在问题的评论中提及)。出于某种原因,即使您将Assembly从SQL Server引入到项目中,SSDT也没有看到它。您在对“将该程序集作为我的项目中的参考文件导入”这个问题的评论中提到,但这可能应该是自动发生的,就像我在测试中那样。

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

我能够通过导入一个项目(“模型识别”设置已被设置为“True”)并将其设置为“False”以获取错误并返回“True “删除错误。


另外,如果由于某种原因,你就坚持得到与错误,似乎“正确”的设置不工作,甚至做一个“清理解决方案”之后,“重新生成解决方案”,甚至关闭关闭并重新启动Visual Studio,则需要删除$(ProjectDir)\ p​​roject_name.dbmdl文件。为了删除该文件,该项目无法在Visual Studio中打开,因为它将被Visual Studio锁定。或者,您可以转到“项目属性”,然后在“项目设置”选项卡上将“目标平台”更改为另一个版本,然后回到原来的状态(类似于其他答案中描述的内容,但不需要在将其翻转回原始版本之前执行“构建”或“重建”),因为这具有删除该.dbmdl文件的副作用。

请注意,.dbmdl文件在项目关闭之前不会写入。因此,如果在首次打开项目时文件不存在,或者您切换到“目标平台”,则在关闭解决方案,卸载项目或退出之前,您将看不到.dbmdl文件视觉工作室。做一个“全部保存”不会写这个文件到磁盘!

+0

该项目已添加为一个名为assembly的文件夹下的现有项目,该文件夹是自动创建的。 Model Aware的第二个选项,我似乎无法找到Model Aware属性,并在提问之前做了特定的帖子。在Assembly的属性中,我看到的只有“Build Action”,“Copy to Output directory”,“File Name”和“Full Path”。我正在使用与SQL 2008兼容的VS 2015,并不确定这与该属性现在显示的原因有什么关系? – Baahubali

+0

@ user1490835对不起,我周末无法参与此活动。我看到您的更新,并且“型号识别”选项位于“参考”区域中,而不在“组件”文件夹中。我只是做了一个导入,并看到了同样的事情。我也看到有人回答,它似乎已经为你工作。这很好,但我对实际原因有些疑虑,因为“目标平台”设置仅控制生成的部署脚本,没有别的。我对实际问题有了一个概念,但不能自己复制它。这是你可以重现的东西吗? –

+0

我从零开始创建了一个新的solutuin,它没有任何问题。所有构建好的但模型感知的属性被自动设置为true,这又是奇怪的。我不知道我应该怎样重现那个错误....我给了你赏金,因为它可能是你的步骤已经解决了这个问题?可能刚刚需要重新启动视觉工作室或类似的东西? – Baahubali