同一数据库项目的未解决引用问题

18
我在Visual Studio 2013中创建了一个SQL Server数据库项目,并导入来自生产数据库的DACPAC。当我尝试构建项目时,会出现数百个SQL71501和SQL71561错误(两者都是“未解析对象引用”)。检查脚本,问题在于许多视图和存储过程使用三部分名称:[数据库]。[模式]。[对象]。
看起来,每当Visual Studio 2013遇到包括由数据库项目表示的数据库的三部分名称时,它就会抛出此错误。例如,如果数据库项目表示数据库“MyDatabase”,并且该项目中的SQL脚本包括类似于SELECT t.Column1 FROM MyDatabase.dbo.MyTable t的内容,则在构建项目时,VS 2013会抛出SQL71501或SQL71561中的任一错误。
是否有办法抑制仅适用于当前数据库的未解析引用错误?我仍然希望Visual Studio对未解析外部数据库的引用抛出错误。
编辑更正:最初声明错误代码为SQL71501。然而,似乎Visual Studio为同一数据库的未解析引用抛出SQL71501和SQL71561错误。

我也在思考这个问题。我找到了一些看起来可以解决的方法,但是后来出现了各种构建错误。唯一成功的方法是从所有同一数据库的存储过程、视图和函数中删除三部分命名。如果你限制文件类型为*.sql并包括模式名称,那么很容易找到,但似乎应该有更好的方法。 - Peter Schott
@PeterSchott:我找到了一个之前的Stackoverflow帖子,似乎证实删除3部分名称是唯一的解决方案:https://dev59.com/SnfZa4cB1Zd3GeqPS4y2。该问题包括一个指向旧MSDN博客的链接,似乎证实我们不能在SSDT数据库项目中使用3部分名称,唯一的解决方法是删除它出现的任何地方的数据库名称。(我还注意到答案中的链接指向我认为是您的博客!)那篇MSDN博客文章已经有5年了,我很失望他们在随后的版本中没有解决这个问题。 - Simon Elms
好的,就像我说的,我有一些部分成功。看起来很不错,直到我构建并发现很多其他东西现在都在抛出错误。我同意这是令人失望的。 - Peter Schott
这是一个糟糕透顶的东西。微软为什么不能做好呢? - Dave
我刚遇到了这个问题。原帖已经超过六年了,但这仍然是一个问题。哪里是正确的场所来提出并(可能)让微软解决它? - Jpirok
2个回答

15

实际上有两种解决方法。我个人认为在当前数据库中的3部分对象名方面,SSDT存在一个错误。

  1. 创建项目快照(dacpac),并引用它作为数据库引用。请记得清除“添加数据库引用”对话框中的数据库变量字段。
    这种方法可行,但不被 Microsoft 推荐,可能会引起其他问题: https://connect.microsoft.com/SQLServer/feedbackdetail/view/1047094/post-deployment-script-is-not-generated-in-the-publish-script

  2. 在你的代码中,将所有出现的 MyDatabase.dbo.MyTable 替换为 [$(DatabaseName)].dbo.MyTable。
    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/1863d960-d32d-4920-9a30-13dc86c6f857/sql71562-unresolved-reference-to-object-followd-by-database-name-in-the-same-project?forum=ssdt&prof=required


我接受你的第二种解决方法(在脚本中使用 [$(DatabaseName)] 作为数据库名称)作为答案。我已经尝试过它,它有效,并且似乎比使用 dacpac 作为数据库引用更少出现问题。干杯。 - Simon Elms
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - MatanCo
我继承了一个数据库项目,它确实有针对 [$(DatabaseName)] 的解决方法,但我仍然收到 SQL71561 错误信息,为什么? - KillerSnail
3
三年后,我解决这个问题的方式已经改变。现在我会在SSDT项目上执行查找和替换操作,将带有末尾"."的"MyDatabase."替换为""(空字符串)。当我在我的非常大的SSDT项目上执行此操作时,仅花费了15分钟就实现了两个目标:1)SSDT项目将能够无错误地构建,从而使我能够执行模式比较和其他操作;2)各个脚本不再嵌入“[$(DatabaseName)]”变量,这有助于它们作为独立的SQL脚本运行(在开发环境中偶尔有用)。 - Simon Elms
别忘了清理和重新构建 - Andrew Richesson

3

在Visual Studio中:

1)打开SQL Object Explorer,链接您的数据库服务器,右键单击未解决的引用数据库,然后选择“提取数据层应用程序”

enter image description here

2)插入文件路径。通常我使用\文档\SQL Server Management Studio\DAC Packages\,然后点击确定

3)等待提取完成

4)右键单击项目的“引用”,选择添加数据库引用

enter image description here

5)然后将函数、存储过程等中的引用替换为[$(YourDB)]前缀。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接