Utilisation d'un serveur lié avec OPENQUERY dans un projet de base de données

10

J'ai un serveur SQL Server 2008 exécutant une base de données que je veux jeter dans TFS. Par conséquent, j'ai utilisé un projet de base de données Visual Studio 2013 dans lequel j'ai importé la base de données. Après avoir corrigé un tas d'erreurs, je suis coincé avec une seule erreur:

Dans une vue, les développeurs utilisés OPENQUERYpour accéder à un serveur lié. J'ai donc importé un DACPAC qui contient la bonne base de données et je l'ai ajouté au projet en Add Database Referenceutilisant les options de référence suivantes.

Paramètres de référence de la base de données

Version initiale du script

Voici une version plus courte de la création de la vue d'origine:

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

Cela a conduit à l'erreur suivante:

Erreur 136 SQL71501: Affichage: [dbo]. [VwStatus] a une référence non résolue à l'objet [LinkedServer].

Premier essai

J'ai donc essayé d'insérer la variable de nom de serveur

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

Qui conduit à

Erreur 176 SQL46010: syntaxe incorrecte près de $ (LinkedServer).

D'autres tentatives

J'ai joué un peu autour et j'ai essayé ce qui suit (avec et sans activer les identifiants cités):

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 

Je reçois toujours une erreur.

Je n'ai aucune idée de ce que je néglige ici. Le faites vous? Merci pour votre temps!

(Malheureusement, je ne peux pas ajouter la balise visual-studio-2013, j'ai donc utilisé visual-studio)

Chake
la source

Réponses:

9

J'ai réussi à le faire fonctionner:

J'ai créé un nouveau projet de base de données master. Là, j'ai créé un dossier Server Objectet un fichier LinkedServer.sql. Dans le fichier SQL, j'ai ajouté le serveur lié:

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

Après avoir ajouté le projet de base de données masterà ma solution et l'avoir référencé dans mon projet de base de données d' origine, j'ai pu construire le projet en utilisant la syntaxe initiale;

CREATE VIEW dbo.vwStatus
AS
SELECT     StatusID, StatusName
FROM       OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1
Chake
la source
Je n'arrive toujours pas à faire fonctionner cela malgré un projet principal avec le fichier LinkedServers.sql
test
Eh bien, il est difficile d'aider sans plus d'informations. il vaut peut-être mieux poser une autre question. Il est important de référencer votre projet maître dans votre solution. sinon cela a fonctionné pour moi exactement comme décrit.
Chake
Dans votre solution - avez-vous un ou plusieurs dacpac ou projet (s) avec les DBA LinkedServer?
Martin Meeser
Salut, je ne me souviens pas, mais j'ai écrit dans le deuxième paragraphe, que j'ai utilisé des dacpacs. Mais pour la solution finale, j'ai référencé un projet de base de données pour la base de données master.
Chake
1
Notez que vous devez vous assurer que votre fichier 'LinkedServer.sql' a une action de génération définie sur 'Build'. De manière ennuyeuse, VS ne semble pas reconnaître le serveur lié à partir d'un script de pré-déploiement, ou tout cela ne serait pas nécessaire.
Taran