【问题标题】:VS 2010 Database Project - SQL03006 ErrorVS 2010 数据库项目 - SQL03006 错误
【发布时间】:2025-08-24 03:15:01
【问题描述】:

我在 VS 2010 中创建了一个新的 SQL Server 数据库项目,从名为“managers”的本地数据库导入数据库对象和设置,并在尝试构建项目时收到以下错误:

SQL03006:视图:[dbo].[vw_mlFunds] 对对象 [managers].[dbo].[mlfunds] 有一个未解析的引用。

我不知道为什么这个视图完全限定了一个表引用以包含实际的数据库名称,我宁愿不必更改 sql,因为它是其他人的代码,而且它在技术上并不正确。但我认为完全限定表名以包含数据库名称会使 VS 编译器感到困惑,因为它需要 [dbo].[mlfunds],而不是 [managers].[dbo].[mlfunds]。如何最好地解决这个问题?我可以在某处设置新的数据库名称变量/别名吗?还是我必须重构/修改 sql 才能编译?提前致谢。

【问题讨论】:

    标签: sql-server visual-studio-2010


    【解决方案1】:

    实际上,似乎必须修改代码,因为这是不受支持的。在这篇文章中找到答案:

    Using local 3-part names in programmability objects

    【讨论】:

    • 如果您将其连接起来并且无法弄清楚为什么您的比较脚本仍在轰炸,请确保在初始“选择源/目标架构”屏幕中设置“SQLCMD 变量”选项。
    【解决方案2】:

    创建项目并导入数据库后,我遇到了同样的错误。我的问题是 FROM 表引用包含完全限定名称,但所选字段没有;如下

    SELEC l.UserID, l.Email, m.DOB, ...
    FROM ***[DBName].dbo***.Layout as l
    LEFT OUTER JOIN masterUs as m
    

    我通过删除 DBName 和 DBO 部分修改了完全限定的引用,所有错误都已解决

    SELECT l.UserID, l.Email, m.DOB, ....
    FROM Layout as l
    LEFT OUTER JOIN masterUs as m
    

    【讨论】:

      【解决方案3】:

      您需要为 [managers] 数据库创建另一个数据库项目,并让您的项目“引用”另一个项目。您可以在 [managers] 数据库上执行一个简单的逆向工程步骤,将数据库中的所有对象导入到新的 VSDB 项目中。见Using References in Database Projects

      【讨论】:

      • 您能帮我澄清一下吗?当两个对象(基表和视图)都驻留在同一个 [managers] 数据库中时,我对引用的需要感到困惑。
      • 我认为 [managed] 是一个不同的数据库。如果视图用数据库名称明确限定表名称,则视图定义在技术上是不正确,因为项目可以部署在不同的数据库名称下,甚至可以在部署后恢复/复制/attached/snapshot 在各种名称下,视图在所有这些情况下都是无效的。
      • 我认为用数据库名称完全限定表是原始开发人员无意的,我们最终可能会修改视图脚本以删除数据库名称引用,但创建脚本视图将在 ssms 中按原样运行而不会出现错误,并且当针对 manager 数据库运行时,它会将对 manager 的显式引用识别为对自身的引用。我同意这是草率的代码,但暂时不要弄乱它,因为它需要测试。这就是为什么我试图弄清楚是否有办法解决这个问题。