SSDT имеет неразрешенную ссылку на объект для представлений, но отлично работает для процедуры - PullRequest
0 голосов
/ 17 июня 2020

Эта ошибка не является «нормальной ошибкой», когда отсутствует ссылка на базу данных. У меня правильно добавлена ​​ссылка на базу данных, и до сих пор она отлично работала с хранимыми процедурами.

Проблема:

У меня есть проект базы данных, назовем его БИДК . В этой базе данных есть ссылка на файл dacpa c, созданный из другого проекта базы данных под названием 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]

Есть идеи, почему это происходит?

Почему это работает для сохраненных pro c, а не для представлений?

Ответы [ 3 ]

0 голосов
/ 17 июня 2020

После тестирования и опробования различных настроек я могу сделать вывод, что «правильный» подход - это использовать синтаксис [$ (RPTDK)] , где RPTDK - это имя параметра, так как он устанавливается, когда добавляется ссылка на базу данных для начала.

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

Это немного раздражает, и код теперь зависит от параметра режима SQLCMD для работы, когда вы хотите скопировать и вставить в Окно SSMS.

Спасибо Альфину за помощь.

ps

Причина, по которой это не дает сбоя в сохраненном pro c, заключается в похоже, что Visual Studio SSDT не проверяет ссылочные объекты в сохраненном pro c, а делает это для представлений. Я попытался удалить ссылку все вместе, но сохраненный код pro c все же удалось успешно построить.

0 голосов
/ 17 июня 2020

Короче говоря, SSDT любит двухчастные имена. Вы можете использовать переменные для имен 3-4 частей, но в идеале вы должны создать либо dacpa c, либо проект для каждой внешней базы данных. Затем ссылайтесь на них в своем основном проекте. Затем для каждого внешнего объекта вам нужно создать синонимы, и тогда у вас не будет больше проблем. Более того, это даст вам возможность иметь разные имена баз данных / экземпляров в разных средах.

Вы можете найти пример того, как организовать решение с SSDT, в моем репозитории github . Я все еще хочу добавить туда еще кое-что, но вы можете увидеть пример того, как с этим работать в вашем случае.

0 голосов
/ 17 июня 2020

У меня был такой случай раньше, вместо того, чтобы указывать имя базы данных, попробуйте выбрать, не указывая имя базы данных, как это

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

у меня сработало

...