【问题标题】:SSDT has an unresolved reference to object for views but works fine for procedureSSDT 对视图对象有未解析的引用,但对过程工作正常
【发布时间】:2020-10-07 00:40:24
【问题描述】:

当缺少数据库引用时,此错误不是“正常错误”。我正确添加了一个数据库引用,到目前为止,它在存储过程中运行良好。

问题:

我有一个数据库项目,我们称之为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。 闪亮快乐的跳舞!

但是,如果我添加此视图,则构建失败:

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】:

    简而言之 - SSDT 喜欢由两部分组成的名称。您可以为 3-4 个部分名称使用变量,但理想情况下,您应该为每个外部数据库创建 dacpac 或项目。然后在您的主项目中引用它们。然后对于每个外部对象,您需要创建同义词,然后您就不会遇到更多问题。此外,它可以让您在不同的环境中拥有不同的数据库/实例名称。

    您可以在我的github repo 中找到如何使用 SSDT 组织解决方案的示例。我仍然想在那里添加更多内容,但是您可以查看一个示例,如何针对您的情况使用它。

    【讨论】:

      【解决方案2】:

      在测试和尝试不同的设置之后,我可以得出结论,“正确”的方法是使用 [$(RPTDK)] 语法,其中 RPTDK 是参数的名称,如它是在添加数据库引用时设置的。

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

      这有点烦人,当您想要复制并粘贴到 SSMS 窗口时,代码现在依赖于 SQLCMD 模式参数才能工作。

      感谢阿尔芬的帮助。

      ps

      这在存储过程中没有失败的原因是,Visual Studio SSDT 似乎没有检查存储过程中的引用对象,而是检查视图。我尝试将引用全部删除,并且存储的 proc 代码仍然成功构建。

      【讨论】:

        【解决方案3】:

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

        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
        

        对我有用

        【讨论】:

        • 第一个没有说明数据库名称的不起作用。但是第二个允许我现在构建,但是,这仍然很烦人,因为我不能再将部分代码从 Visual Studio 复制到 SSMS,而无需不断地从 $ 版本切换(这本质上是一个参数 i SQLCMD模式)和实际值。这真的很烦人,但感谢您的帮助。
        猜你喜欢
        • 1970-01-01
        • 2019-08-31
        • 1970-01-01
        • 2015-07-06
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多