Использование связанного сервера с OPENQUERY в проекте базы данных

10

У меня есть SQL Server 2008 с базой данных, которую я хочу добавить в TFS. Поэтому я использовал проект базы данных Visual Studio 2013, куда я импортировал БД. После исправления множества ошибок я застрял с единственной оставшейся ошибкой:

В одном представлении разработчики использовали OPENQUERYдля доступа к связанному серверу. Поэтому я импортировал DACPAC, который содержит нужную базу данных, и добавил его в проект, используя Add Database Referenceследующие опорные параметры.

Настройки для ссылки на базу данных

Начальная версия скрипта

Вот более короткая версия оригинального создания представления:

CREATE VIEW dbo.vwStatus
AS
SELECT     StatusID, StatusName
FROM       OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1

Это приводит к следующей ошибке:

Ошибка 136 SQL71501: представление: [dbo]. [VwStatus] имеет неразрешенную ссылку на объект [LinkedServer].

Первая попытка

Поэтому я попытался вставить переменную имени сервера

FROM       OPENQUERY($(LinkedServer), 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1

Что приводит к

Ошибка 176 SQL46010: неправильный синтаксис около $ (LinkedServer).

Дальнейшие попытки

Я немного поиграл arround и попробовал следующее (с включенными и без включенных в кавычки идентификаторов):

FROM       OPENQUERY("$(LinkedServer)", 'SELECT * FROM [DB].[dbo].tbStatus') AS 
FROM       OPENQUERY([$(LinkedServer)], 'SELECT * FROM [DB].[dbo].tbStatus') AS 
FROM       OPENQUERY([LinkedServer], 'SELECT * FROM [DB].[dbo].tbStatus') AS 
FROM       OPENQUERY("LinkedServer", 'SELECT * FROM [DB].[dbo].tbStatus') AS 

Я всегда получаю ошибку.

Я понятия не имею, что я здесь пропускаю. Вы? Спасибо за ваше время!

(К сожалению, я не могу добавить тег visual-studio-2013, поэтому я использовал visual-studio)

Chake
источник

Ответы:

9

Мне удалось заставить это работать:

Я создал новый проект базы данных master. Там я создал папку Server Objectи файл LinkedServer.sql. В файле SQL я добавил связанный сервер:

GO
EXECUTE sp_addlinkedserver @server = N'LinkedServer', @srvproduct = N'sqlserver', @provider = N'SQLNCLI', @datasrc = N'LinkedServer.domain';

После добавления базы данных Project masterв мое решение и ссылки на нее в моем исходном проекте базы данных, я смог построить проект с использованием исходного синтаксиса;

CREATE VIEW dbo.vwStatus
AS
SELECT     StatusID, StatusName
FROM       OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1
Chake
источник
Я все еще не могу заставить это работать, несмотря на то, что у меня есть главный проект с файлом LinkedServers.sql
тест
Ну, трудно помочь без дополнительной информации. возможно, лучше задать другой вопрос. Важно сослаться на ваш главный проект в вашем решении. в противном случае это сработало для меня именно так, как описано.
Chake
В рамках вашего решения - есть ли у вас dacpac (s) или проект (ы) с администраторами баз данных LinkedServer?
Мартин Мизер
Привет, я не помню, но я написал во втором абзаце, что я использовал dacpacs. Но для окончательного решения я ссылался на проект базы данных для главной БД.
Chake
1
Обратите внимание, что вы должны убедиться, что для файла LinkedServer.sql установлено действие «Build». Досадно, что VS не распознает связанный сервер из сценария Pre Deployment, или все это не нужно.
Таран