2009-04-17 9 views
6

Ich versuche, Daten von verschiedenen Server zu erhalten, und der Servername kann sich ändern. Also habe ich den Servernamen als Parameter festgelegt. Die Idee meiner SQL-Store-Prozedur ist so etwas wieServername als Variable

CREATE PROCEDURE [dbo].[GetData] 
     @ServerName 
AS 
BEGIN 
    SELECT * FROM @ServerName.ClientDataBase.dbo.Client 
END 

Weiß jemand, wie man das erreicht?

Die Datenbank-Version von SQL Server 2005

Antwort

5

Verwenden dynamische SQL ist, kann jedoch böse sein:

exec('select * from ' + @ServerName + '.ClientDatabase.dbo.Client') 
3

Schauen Sie sich mit Synonym (e)

Syntax erstellen (von MSDN):

CREATE SYNONYM [ schema_name_1. ] synonym_name FOR <object> 

<object> :: = 
{ 
    [ server_name.[ database_name ] . [ schema_name_2 ].| 
     database_name . [ schema_name_2 ].| schema_name_2. ] object_name 
} 
+0

Güter Ideen- Werke für eine begrenzte Anzahl von Servernamen – gbn

+0

Es scheint mir, dass sowohl die SYNONYM CREATE und die sp_setnetname hier Vorschläge könnte mit unbeabsichtigten Folgen haben Nebenläufigkeit, da die Operationen global wirken. Das heißt, wenn sich zwei solche Operationen überlappen, können eine oder beide Operationen fehlschlagen und die Serverkonfiguration in einem inkonsistenten Zustand belassen. –

3

Sie könnten einen Verbindungsserver einrichten, sagt "BOB".

Dann könnten Sie sp_setnetname aufrufen, um den zugrunde liegenden Zielserver zu ändern, aber behalten Sie den Namen BOB bei.

So würde Ihr Code sein:

CREATE PROCEDURE [dbo].[GetData] 
     @ServerName 
AS 
BEGIN 
    EXEC sp_setnetname 'BOB', @ServerName 
    SELECT * FROM BOB.ClientDataBase.dbo.Client 
END 
+0

Sie müssten den Verbindungsserver ebenfalls löschen, es sei denn, Sie führen diesen SP nur einmal aus. –

+0

Warum? Mit sp_setnetname können Sie das Ziel für den Verbindungsserver neu definieren – gbn

+0

Dieser Server funktioniert, außer dass sp_setnetname die Serverrollen sysadmin und setupadmin erfordert – ren

0
-- Proc to get remove server name (domaine+instance name) 

IF OBJECT_ID('dbo.getRemoteName') IS NOT NULL 
     DROP PROC dbo.getRemoteName; 
GO 
CREATE PROC dbo.getRemoteName 
@id AS INT, 
@RETURN AS VARCHAR(100) OUTPUT 
AS 
BEGIN 
DECLARE @GetInstances TABLE 
(id INT IDENTITY(0,1), 
    VALUE NVARCHAR(100), 
    instanceName NVARCHAR(100), 
    DATA NVARCHAR(100)) 

INSERT INTO @GetInstances 
EXECUTE xp_regread 
@rootkey = 'HKEY_LOCAL_MACHINE', 
@KEY = 'SOFTWAREMicrosoftMicrosoft SQL Server', 
@value_name = 'InstalledInstances' 

-- order ascendant 
-- Select * from @GetInstances -- uncomment to see all the instances that your have 
SELECT @RETURN=instanceName FROM @GetInstances WHERE [email protected] ORDER BY instanceName ASC; 
SET @RETURN=HOST_NAME()+''[email protected]; 
END; 
GO 

DECLARE @RETURN AS VARCHAR(100); 
-- get the instance number 0 
EXEC getRemoteName 0, @RETURN OUTPUT; 
PRINT @RETURN; 





-- 

exec('SELECT * FROM ['[email protected]+'].RemoteDatabase.dbo.SampleTable');