使服务器名称作为变量

问题描述:

我想从不同的服务器获取数据,并且服务器名称可能会更改。所以我将服务器名称设置为参数。我的SQL存储过程的想法是这样的使服务器名称作为变量

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

有谁知道如何做到这一点?

的数据库版本是SQL Server 2005中

使用动态SQL,但是邪恶的,这可能是:在使用同义字(词)

创建(从MSDN)语法

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

看:

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

你可以设置一个链接服务器,说“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

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