【问题标题】:VS 2012 Database Project "unresolved reference to object" ErrorVS 2012 数据库项目“未解决的对象引用”错误
【发布时间】:2012-11-02 14:58:09
【问题描述】:

我在 VS 2012 中创建了 SQL Server 数据库项目并导入了我们的数据库。 当我构建项目时,我得到很多“未解决的对象引用”错误。 这些错误仅适用于我数据库中的几个视图。 这些视图的语法是正确的,我没有使用临时表。 我应该检查什么来解决这个问题?

更新: 这是一个例子:

    CREATE view [Factory].[NonStartedOrders]
as
 SELECT 

"Customers"."CustomerName", "Customers"."CustomerAName",
"Customers"."MarketID",
"Orders"."OrderID", 
"Orders"."ApproveDate", 
"FactoryOrders"."FactoryID", 
"FactoryOrders"."EstEndDate", 
"FactoryOrders"."StatusID", 
"FactoryOrders"."TotalWeight", 
"Karats"."KaratEName"

FROM   (("Taiba"."Sales"."FactoryOrders" "FactoryOrders" 
INNER JOIN "Taiba"."Sales"."Orders" "Orders" ON "FactoryOrders"."OrderID"="Orders"."OrderID") 
INNER JOIN "Taiba"."General"."Customers" "Customers" ON "Orders"."CustomerID"="Customers"."CustomerID") 
INNER JOIN "Taiba"."MasterPiece"."Karats" "Karats" ON "Orders"."MKaratID"="Karats"."KaratID"

“Taiba”这里是我的数据库名称。 仅针对此视图,我收到 30 个错误。 这些是其中的一些错误:

Error   217 SQL71561: View: [Factory].[NonStartedOrders] has an unresolved reference to object [Taiba].[Sales].[FactoryOrders]

Error   219 SQL71561: View: [Factory].[NonStartedOrders] contains an unresolved reference to an object. Either the object does not exist or the reference is ambiguous because it could refer to any of the following objects: [Taiba].[Sales].[FactoryOrders].[FactoryOrders]::[OrderID], [Taiba].[Sales].[FactoryOrders].[OrderID] or [Taiba].[Sales].[Orders].[FactoryOrders]::[OrderID].

【问题讨论】:

  • 第一步:展示其中一个视图的示例,以及具体的错误。还要记住,仅仅因为数据库“工作”,并不意味着您没有真正的错误和警告,而您以前不知道。
  • 我已经用一个例子更新了这个问题。

标签: database visual-studio-2012 sql-server-data-tools


【解决方案1】:

我解决了这个问题。

似乎我的一些视图/SP 使用此命名约定(3 部分限定名称)引用了表:

DatabaseName.SchemaName.TableName

我将所有引用更改为如下:

SchemaName.TableName

【讨论】:

  • 以防万一有人看到这个错误并且上面没有为你做这件事......如果你有一个 VS DB 项目和你的列,你也有可能看到这个错误'在存在错误的对象中引用的 re 与您签入 TFS 的表定义不匹配(与实际列相反)。 HTH。
  • 这也是我想出的解决方法,但如果您接触了数百个数据库对象的代码,我不会将其称为解决方案。
  • 如果您使用此解决方法,如果在主数据库中使用相同的 SchemaName.TableName,您可能会遇到问题。
【解决方案2】:

在我的例子中,找不到的函数是 Build Action=None,所以它没有被包含在编译中。

将 Build Action 更改为 Build 更正了此问题。

【讨论】:

  • 这意味着您实际上并没有编译文件。
  • 这对我有帮助,我在添加新脚本文件时错误地选择了“脚本(不在构建中)”作为脚本类型,而我想要的是“脚本(构建)”
【解决方案3】:

另一种可能性是您在视图/表等中使用的架构在项目中不存在。您可能需要将架构添加到 VS 数据库项目。

右击项目和Add > New Item > Schema

【讨论】:

  • 这正是我想要的。
  • 谢谢 - 我正在为 Azure SQL 数据仓库手动构建一个数据库项目,只是为了进行源代码控制,这正是我所需要的
  • 确保添加了模式类型的文件。如果您在创建架构时添加“脚本”类型的文件(扩展名为 .sql 的普通文件),则未解决的引用问题将持续存在
【解决方案4】:

尝试显式定义类:

class: 指定权限所在的安全对象的类 的确。范围限定符 :: 是必需的。

阅读有关 SQL GRANT 语句的文档:http://technet.microsoft.com/en-us/library/ms187965.aspx

在我的例子中,我有一个用户定义的表类型。

GRANT EXECUTE ON TYPE::[dbo].[MessageTableType] TO [PostOffice_Role];

【讨论】:

    【解决方案5】:

    这发生在我在 Visual Studio 2015 中构建 CTE 时。我将构建操作更改为编译并且错误消失了。

    1. 选择有错误的文件
    2. 按 F4 查看属性。
    3. 在“构建操作”下拉列表中选择“编译”。

    希望这对某人有所帮助。

    【讨论】:

    • 我试过了。确实错误消失了,但模式比较比坏了。它不再识别项目中的结构......
    【解决方案6】:

    当您添加表(使用 .sql 文件)并且如果您不签入 .sqlproj 文件时,您也会收到此错误

    【讨论】:

      【解决方案7】:

      对象可能位于项目文件中的 NotInBuild 标记内,用于命名或其他问题。在我的情况下,我用 ..sql 保存了文件,额外的点导致它在项目文件内的 NotInBuild 标记下移动。我更正了扩展并将丢失的对象移到构建标记下,从而解决了问题。

      【讨论】:

        【解决方案8】:

        这可能是一种极端情况,但如果在您的对象定义中您还使用 sp_addextendedproperty 记录该对象(无论如何我们都会这样做...),如果您声明了不正确的对象类型,您也可能会收到此错误 - 这可能会发生如果复制和粘贴。仔细想想,“未解决的对象引用”错误在这里是有道理的。

        例如,以下将重新创建错误,因为 level1type 应该是“PROCEDURE”而不是“FUNCTION”。

        EXEC sp_addextendedproperty
          @name = N'MS_Description',
          @value = N'Description of the stored procedure...',
          @level0type = N'SCHEMA',
          @level0name = N'dbo',
          @level1type = FUNCTION',
          @level1name = N'spMyStoredProcedureName'
        GO
        

        【讨论】:

          【解决方案9】:

          要引用另一个 sqlproj 的架构并使用三部分命名,请修改您的 .sqlproj 文件以在引用的项目上添加 DatabaseVariableLiteralValue 元素。

          在元素内喜欢 <ProjectReference Include="..\SomeDatabaseProject\SomeDatabaseProject.sqlproj">,添加以下内容:

          <DatabaseVariableLiteralValue>SomeDatabaseProject</DatabaseVariableLiteralValue>

          例如:

              <ProjectReference Include="..\SomeDatabaseProject\SomeDatabaseProject.sqlproj">
                <Name>SomeDatabaseProject</Name>
                <Project>{some-project-guid}</Project>
                <Private>True</Private>
                <DatabaseVariableLiteralValue>SomeDatabaseProject</DatabaseVariableLiteralValue>
              </ProjectReference>
          

          然后您可以使用干净的三部分命名引用,例如SomeDatabaseProject.SomeSchema.SomeTable

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-01
            • 2020-02-13
            • 2021-02-02
            • 1970-01-01
            • 2016-06-08
            • 2011-05-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多