SSDT对视图有一个未解决的对象引用,但对存储过程却能正常工作。

问题描述 投票:0回答:1

这个错误不是 "正常的错误",当缺少数据库引用时。我的数据库引用添加得很正确,目前用存储过程工作得很好。

问题是这样的。

我有一个数据库项目,让我们把它叫做: BIDK. 这个数据库有一个dacpac文件的引用,是由另一个数据库项目建立的,叫做 RPTDK.

RPTDK 有一个叫 dbo.BILLINGITEM,我可以参考 BIDK 数据库项目使用这段代码。

create proc CommonDM.TestReferenceFromProc
as
select BILLINGITEM_ID,
       TIMESTAMP,
       BILLINGITEMTYPE_ENUMID,
       VATCODE_ENUMID,
       LCOMPANY_ID,
       LEASESERVICECOMPONENT_ID
from [RPTDK].[dbo].BILLINGITEM as bilitm;

这很好,我可以建立BIDK项目。Shiny Happy Poeple Dancing!

然而,如果我添加这个视图,那么构建失败。

create view CommonDM.TestReferenceFromView
as
select BILLINGITEM_ID,
       TIMESTAMP,
       BILLINGITEMTYPE_ENUMID,
       VATCODE_ENUMID,
       LCOMPANY_ID,
       LEASESERVICECOMPONENT_ID
from [RPTDK].[dbo].BILLINGITEM as bilitm

我无法建立项目 BIDK 添加了视图,但我得到了错误信息。

[CommonDM].[TestReferenceFromView] has an unresolved reference to object [RPTDK].[dbo].[BILLINGITEM]

知道为什么会这样吗?

为什么对存储过程有效而对视图无效?

sql-server sql-server-data-tools database-project
1个回答
0
投票

我之前也遇到过这样的情况,不指定数据库名,而是尝试不指定数据库名的情况下进行选择,像这样

select BILLINGITEM_ID,
   TIMESTAMP,
   BILLINGITEMTYPE_ENUMID,
   VATCODE_ENUMID,
   LCOMPANY_ID,
   LEASESERVICECOMPONENT_ID
from [dbo].BILLINGITEM

或使用[$DBName]作为数据库名称,像这样。

select BILLINGITEM_ID,
   TIMESTAMP,
   BILLINGITEMTYPE_ENUMID,
   VATCODE_ENUMID,
   LCOMPANY_ID,
   LEASESERVICECOMPONENT_ID
from [$RPTDK].[dbo].BILLINGITEM as bilitm

对我有用


0
投票

经过测试和尝试不同的设置,我可以得出结论,"正确 "的方法是使用的。[$(RPTDK)] 语法,其中RPTDK是参数的名称,因为它是在一开始添加数据库引用时设置的。

select BILLINGITEM_ID,
       TIMESTAMP,
       BILLINGITEMTYPE_ENUMID,
       VATCODE_ENUMID,
       LCOMPANY_ID,
       LEASESERVICECOMPONENT_ID
from [$(RPTDK)].[dbo].BILLINGITEM as bilitm

这是一个有点烦人的问题,当你想复制和粘贴到SSMS窗口时,代码现在依赖于一个SQLCMD模式参数来工作。

谢谢Alfin的帮助。

ps

为什么在存储过程中没有失败,原因是Visual Studio SSDT似乎并没有检查存储过程中的引用对象,而是对视图进行检查。我试着把引用全部删除,但存储过程中的代码仍然能够成功构建。


0
投票

简而言之--SSDT喜欢2部分的名字。你可以使用变量来命名3-4个部分,但理想的情况是你应该为每个外部数据库创建dacpac或project。然后在你的主项目中引用它们。然后为每个外部对象创建同义词,这样你就不会有更多的问题了。此外,这将使您有可能在不同的环境中使用不同的数据库实例名称。

你可以在我的文章中找到如何使用SSDT组织解决方案的例子。github repo. 我还想在那里添加一些更多的东西,但你可以看到一个例子,如何使用它为您的情况。

© www.soinside.com 2019 - 2024. All rights reserved.