Использование связанного сервера с 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)

Ответы:


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

Я все еще не могу заставить это работать, несмотря на то, что у меня есть главный проект с файлом LinkedServers.sql
тест

Ну, трудно помочь без дополнительной информации. возможно, лучше задать другой вопрос. Важно сослаться на ваш главный проект в вашем решении. в противном случае это сработало для меня именно так, как описано.
Chake

В рамках вашего решения - есть ли у вас dacpac (s) или проект (ы) с администраторами баз данных LinkedServer?
Мартин Мизер

Привет, я не помню, но я написал во втором абзаце, что я использовал dacpacs. Но для окончательного решения я ссылался на проект базы данных для главной БД.
Chake

1
Обратите внимание, что вы должны убедиться, что для файла LinkedServer.sql установлено действие «Build». Досадно, что VS не распознает связанный сервер из сценария Pre Deployment, или все это не нужно.
Таран
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.