43

我在 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].
4

9 回答 9

45

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

右键单击项目并Add > New Item > Schema

于 2014-02-03T02:29:44.450 回答
27

我解决了这个问题。

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

DatabaseName.SchemaName.TableName

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

SchemaName.TableName

于 2012-12-02T12:14:07.270 回答
17

就我而言,找不到的函数是 Build Action= None,因此它没有包含在编译中。

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

于 2013-10-25T06:05:42.800 回答
11

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

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

希望这可以帮助某人。

于 2015-10-22T19:26:01.907 回答
5

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

在 like 元素 <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.

于 2019-10-01T14:07:07.067 回答
1

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

于 2018-05-07T13:39:57.643 回答
0

尝试显式定义类:

class:指定被授予权限的安全对象的类。范围限定符 :: 是必需的。

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

就我而言,我有一个用户定义的表类型。

GRANT EXECUTE ON TYPE::[dbo].[MessageTableType] TO [PostOffice_Role];
于 2014-03-26T01:00:10.260 回答
0

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

于 2016-08-24T11:55:53.703 回答
0

这可能是一种极端情况,但如果在您的对象定义中您还使用 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
于 2018-12-14T11:15:45.870 回答