我在 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].
另一种可能性是您在视图/表等中使用的模式在项目中不存在。您可能需要将架构添加到 VS 数据库项目。
右键单击项目并
Add > New Item > Schema
我解决了这个问题。
我的一些观点/SP 似乎已经使用此命名约定引用了表格(3 部分限定名称):
DatabaseName.SchemaName.TableName
我将所有引用更改为以下内容:
SchemaName.TableName
在我的例子中,找不到的函数是 Build Action=None,因此它没有包含在编译中。
将构建操作更改为 Build 纠正了此问题。
我在 Visual Studio 2015 中构建 CTE 时发生了这种情况。我将“构建操作”更改为“编译”,错误就消失了。
希望这对某人有帮助。
要引用另一个 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
。
由于命名或其他问题,对象可能位于项目文件中的 NotInBuild 标记内。就我而言,我用 ..sql 保存文件,额外的点导致它移动到项目文件内的 NotInBuild 标签下。我更正了扩展并将丢失的对象移动到构建标签下,这解决了问题。
尝试显式定义类:
class:指定权限所在的安全对象的类 的确。范围限定符 :: 是必需的。
阅读有关 SQL
GRANT
语句的文档:http://technet.microsoft.com/en-us/library/ms187965.aspx
就我而言,我有一个用户定义的表类型。
GRANT EXECUTE ON TYPE::[dbo].[MessageTableType] TO [PostOffice_Role];
当您添加表(使用 .sql 文件)并且不签入 .sqlproj 文件时,您也会收到此错误
这可能是一种边缘情况,但如果在您的对象定义中您还使用 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
我有一个 DacPac 项目,其中包含使用三部分命名来引用包含数据库的对象(存在数百个实例,例如 [thisDb].[dbo].[obj]* )。我需要比较和更新这个数据库,但是由于 200 多个 sql71561 错误,数据库项目无法构建。
我不想想要删除不必要的数据库名称部分或切换到使用数据库名称变量。要成功构建、(正确)比较,然后使用三部分命名或完全限定命名来引用本身更新数据库,有一种方法可以安抚 Visual Studio: