Verwenden eines Verbindungsservers mit OPENQUERY in einem Datenbankprojekt

10

Ich habe einen SQL Server 2008, auf dem eine Datenbank ausgeführt wird, die ich in TFS einfügen möchte. Daher habe ich ein Visual Studio 2013-Datenbankprojekt verwendet, in das ich die Datenbank importiert habe. Nachdem ich eine Reihe von Fehlern behoben habe, habe ich nur noch einen Fehler:

In einer Ansicht verwenden die Entwickler OPENQUERYden Zugriff auf einen Verbindungsserver. Also habe ich einen DACPAC importiert, der die richtige Datenbank enthält, und ihn Add Database Referencemithilfe der folgenden Referenzoptionen zum Projekt hinzugefügt .

Einstellungen für die Datenbankreferenz

Erste Skriptversion

Hier ist eine kürzere Version der ursprünglichen Ansichtserstellung:

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

Dies führte zu folgendem Fehler:

Fehler 136 SQL71501: Ansicht: [dbo]. [VwStatus] hat einen ungelösten Verweis auf das Objekt [LinkedServer].

Erster Versuch

Also habe ich versucht, die Servernamenvariable einzufügen

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

Was dazu führt

Fehler 176 SQL46010: Falsche Syntax in der Nähe von $ (LinkedServer).

Weitere Versuche

Ich habe ein bisschen herumgespielt und Folgendes versucht (mit und ohne aktivierten Anführungszeichen):

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 

Ich bekomme immer einen Fehler.

Ich habe keine Ahnung, was ich hier übersehen habe. Machst du? Vielen Dank für Ihre Zeit!

(Leider kann ich das Tag "visual-studio-2013" nicht hinzufügen, daher habe ich "visual-studio" verwendet.)

Chake
quelle

Antworten:

9

Ich habe es geschafft, es zum Laufen zu bringen:

Ich habe ein neues Datenbankprojekt erstellt master. Dort habe ich einen Ordner Server Objectund eine Datei erstellt LinkedServer.sql. In der SQL-Datei habe ich den Verbindungsserver hinzugefügt:

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

Nachdem ich das Datenbankprojekt masterzu meiner Lösung hinzugefügt und in meinem ursprünglichen Datenbankprojekt referenziert hatte, konnte ich das Projekt mit der anfänglichen Syntax erstellen.

CREATE VIEW dbo.vwStatus
AS
SELECT     StatusID, StatusName
FROM       OPENQUERY(LinkedServer, 'SELECT * FROM [DB].[dbo].tbStatus') AS derivedtbl_1
Chake
quelle
Ich kann das immer noch nicht zum Laufen bringen, obwohl ich dort ein Masterprojekt mit der Datei LinkedServers.sql habe
Test
Nun, es ist schwer zu helfen, ohne weitere Informationen. Vielleicht ist es besser, eine andere Frage zu stellen. Es ist wichtig, dass Sie Ihr Masterprojekt in Ihrer Lösung referenzieren. ansonsten funktionierte das bei mir genau wie beschrieben.
Chake
Haben Sie in Ihrer Lösung einen Dacpac oder ein Projekt mit den LinkedServer-Datenbankadministratoren?
Martin Meeser
Hallo, ich kann mich nicht erinnern, aber ich habe im zweiten Absatz geschrieben, dass ich Dacpacs verwendet habe. Für die endgültige Lösung habe ich jedoch auf ein Datenbankprojekt für die Master-Datenbank verwiesen.
Chake
1
Beachten Sie, dass Sie sicherstellen müssen, dass in Ihrer Datei 'LinkedServer.sql' die Build-Aktion auf 'Build' gesetzt ist. Ärgerlicherweise scheint VS den Verbindungsserver nicht anhand eines Pre-Deployment-Skripts zu erkennen, da dies sonst nicht erforderlich wäre.
Taran