Usando um servidor vinculado com OPENQUERY em um projeto de banco de dados

10

Eu tenho um SQL Server 2008 executando um banco de dados que eu quero lançar no TFS. Portanto, usei um projeto de banco de dados do Visual Studio 2013 onde importei o banco de dados. Depois de corrigir um monte de erros, fico com apenas um erro restante:

Em uma exibição, os desenvolvedores usados OPENQUERYpara acessar um servidor vinculado. Portanto, importei um DACPAC que contém o banco de dados correto e o adicionei ao projeto Add Database Referenceusando as seguintes opções de referência.

Configurações para referência de banco de dados

Versão inicial do script

Aqui está uma versão mais curta da criação da vista original:

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

Isso levou ao seguinte erro:

Erro 136 SQL71501: Modo de exibição: [dbo]. [VwStatus] tem uma referência não resolvida para o objeto [LinkedServer].

Primeira tentativa

Então eu tentei inserir a variável de nome do servidor

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

O que leva a

Erro 176 SQL46010: Sintaxe incorreta próxima a $ (LinkedServer).

Tentativas adicionais

Eu brinquei um pouco e tentei o seguinte (com e sem ter os identificadores citados ativados):

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 

Estou sempre recebendo um erro.

Não tenho idéia do que estou ignorando aqui. Você? Obrigado pelo seu tempo!

(Infelizmente não consigo adicionar a tag visual-studio-2013, usei o visual-studio)

Chake
fonte

Respostas:

9

Eu consegui fazê-lo funcionar:

Eu criei um novo projeto de banco de dados master. Lá eu criei uma pasta Server Objecte um arquivo LinkedServer.sql. No arquivo SQL, adicionei o servidor vinculado:

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

Depois de adicionar o projeto de banco de dados masterà minha solução e referenciá-lo no meu projeto de banco de dados original, consegui compilar o projeto usando a sintaxe inicial;

CREATE VIEW dbo.vwStatus
AS
SELECT     StatusID, StatusName
FROM       OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1
Chake
fonte
Ainda não consigo fazer isso funcionar, apesar de ter um projeto mestre com o arquivo LinkedServers.sql lá
teste
Bem, é difícil ajudar sem mais informações. talvez seja melhor fazer outra pergunta. É importante referenciar seu projeto mestre em sua solução. caso contrário, isso funcionou para mim exatamente como descrito.
Chake
Dentro da sua solução - você tem um dacpac (s) ou projeto (s) com os DBAs do LinkedServer?
Martin Meeser
Olá, não me lembro, mas escrevi no segundo parágrafo que usei dacpacs. Mas, para a solução final, referenciei um projeto de banco de dados para o banco de dados mestre.
Chake
11
Observe que você deve garantir que o arquivo 'LinkedServer.sql' tenha a ação de compilação definida como 'Compilar'. Irritantemente, o VS parece não reconhecer o servidor vinculado de um script de pré-implantação, ou tudo isso não seria necessário.
Taran