2009-04-17 6 views
6

Próbuję uzyskać dane z różnych serwerów, a nazwa serwera może ulec zmianie. Dlatego ustawiam nazwę serwera jako parametr. Pomysł mojej procedury składowania sql jest podobny do tego: Czy ktoś wie, jak to osiągnąć?Ustaw nazwę serwera jako zmienną

Wersja bazy danych serwera SQL 2005

Odpowiedz

5

używają dynamicznego SQL, jednak zła może to być:

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

przyjrzeć przy użyciu Synonim (y)

Tworzenie składni (z MSDN):

+0

Dobry idea- Pracuje dla ograniczonej liczby nazw serwerów – gbn

+0

Wydaje mi się, że zarówno CREATE synonim i sugestie sp_setnetname tutaj może mieć niezamierzone konsekwencje z współbieżność, ponieważ operacje mają globalny efekt. Oznacza to, że jeśli dwie takie operacje zachodzą na siebie, jedna lub obie operacje mogą zawieść i pozostawić konfigurację serwera w niespójnym stanie. –

3

Można ustawić połączony serwer, mówi "BOB".

Następnie możesz wywołać sp_setnetname, aby zmienić bazowy serwer docelowy, ale zachowaj nazwę BOB.

Tak Twój kod będzie:

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

Należy również usunąć połączony serwer, chyba że uruchamiasz ten SP tylko jeden raz. –

+0

Dlaczego? sp_setnetname pozwala na nowo zdefiniować docelowy serwer połączony – gbn

+0

ten działa, z wyjątkiem sp_setnetname wymaga ról serwera sysadmin i setupadmin – 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');