2009-04-17 116 views
6

我想從不同的服務器獲取數據,並且服務器名稱可能會更改。所以我將服務器名稱設置爲參數。我的SQL存儲過程的想法是這樣的使服務器名稱作爲變量

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

有誰知道如何做到這一點?

的數據庫版本是SQL Server 2005中

回答

5

使用動態SQL,但是邪惡的,這可能是:在使用同義字(詞)

創建(從MSDN)語法

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

看:

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

好idea- Works的服務器名稱 – gbn 2009-04-17 11:28:53

+0

數量有限在我看來,無論是CREATE SYNONYM和sp_setnetname建議在這裏可能有意想不到的後果因爲這些操作具有全球效應。也就是說,如果兩個此類操作重疊,則一個或兩個操作可能會失敗,並使服務器配置處於不一致狀態。 – 2010-04-16 18:51:55

3

你可以設置一個鏈接服務器,說「BOB」。

然後,您可以調用sp_setnetname來更改底層目標服務器,但保留名稱BOB。

所以,你的代碼是:

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

您需要刪除鏈接的服務器,除非只運行一次該SP。 – 2009-04-19 19:49:50

+0

爲什麼? sp_setnetname允許您重新定義鏈接的服務器目標 – gbn 2009-04-20 04:13:44

+0

此人正在工作,但sp_setnetname需要sysadmin和setupadmin服務器角色 – ren 2013-05-23 13:35:20

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');