【问题标题】:Unresolved References to Same Database Project对同一数据库项目的未解决引用
【发布时间】:2014-11-01 05:31:03
【问题描述】:

我在 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 错误。

【问题讨论】:

  • 我也想知道这个。我发现了一些似乎可行的方法,但随后出现了各种构建错误。我取得的唯一成功是从同一数据库的所有过程、视图和函数中删除了 3 部分命名。如果您限制为 *.sql 类型的文件并包含架构名称,则相对容易找到,但似乎应该有更好的方法。
  • @PeterSchott:我发现以前的 Stackoverflow 帖子似乎确认删除 3 个部分名称是唯一的解决方案:stackoverflow.com/questions/19153996/…。该问题包括一个指向旧 MSDN 博客的链接,该博客似乎确认我们不能在 SSDT 数据库项目中使用 3 部分名称,唯一的解决方法是在出现的任何地方删除数据库名称。 (我还注意到答案中的链接指向我认为是您的博客!)该 MSDN 博客文章已有 5 年历史,我很失望他们没有在后续版本中解决此问题。
  • 好吧,就像我说的,我取得了部分的成功。它看起来很棒,直到我构建并发现很多其他东西现在都在抛出错误。我同意这令人失望。
  • 多么水力压裂的位置。为什么 MSFT 不能做到这一点?
  • 我刚遇到这个问题。 OP 已经超过六年了,这仍然是一个问题。什么是提出这个问题的合适场所,并且(可能)由 MS 解决?

标签: visual-studio-2013 sql-server-data-tools database-project


【解决方案1】:

在 Visual Studio 中:

1) 打开 SQL 对象资源管理器,链接您的数据库服务器,右键单击未解析的参考数据库和“提取数据层应用程序”

2) 插入文件路径。通常我使用 \Documents\SQL Server Management Studio\DAC Packages\ 并单击 OK

3) 等待提取

4) 右键单击​​您的项目引用并添加数据库引用

5) 然后用 [$(YourDB)] 前缀替换函数中的引用,SP, ..

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

    • 我接受您的#2 解决方法(在脚本中使用 [$(DatabaseName)] 作为数据库名称)作为答案。我已经尝试过了,它有效,而且它似乎比使用 dacpac 作为数据库参考更容易出现问题。干杯。
    • 它未能帮助我尝试将 dacpac 部署到天蓝色。我有自己的错误要解决,我不能浪费时间解决微软的错误
    • 我继承了一个数据库项目,它确实有 [$(DatabaseName)] 的解决方法,但我仍然得到 SQL71561,为什么?
    • 三年后,我处理这个问题的方式发生了变化。现在我将在 SSDT 项目上进行查找和替换,替换“MyDatabase”。 (注意尾随“。”)和“”(空字符串)。当我在我的非常大的 SSDT 项目上这样做时,只用了 15 分钟就完成了两件事:1)SSDT 项目将无错误地构建,允许我执行模式比较和其他操作; 2) 各个脚本不再嵌入 [$(DatabaseName)] 变量,这将阻止它们作为独立的 SQL 脚本运行(有时在开发环境中有用)。
    猜你喜欢
    • 2011-11-30
    • 2012-11-02
    • 2020-02-13
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2021-02-02
    • 2016-02-12
    • 2016-06-08
    相关资源
    最近更新 更多