Sql 将服务器名称设为变量

Sql 将服务器名称设为变量,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试从不同的服务器获取数据,服务器名称可能会更改。因此,我将服务器名称设置为一个参数。我的sql存储过程是这样的 CREATE PROCEDURE [dbo].[GetData] @ServerName AS BEGIN SELECT * FROM @ServerName.ClientDataBase.dbo.Client END 有人知道如何做到这一点吗 数据库版本为sql server 2005请使用动态sql,无论这种情况多么恶劣: exec('select

我正在尝试从不同的服务器获取数据,服务器名称可能会更改。因此,我将服务器名称设置为一个参数。我的sql存储过程是这样的

CREATE PROCEDURE [dbo].[GetData]
        @ServerName
AS
BEGIN
    SELECT * FROM @ServerName.ClientDataBase.dbo.Client
END
有人知道如何做到这一点吗


数据库版本为sql server 2005

请使用动态sql,无论这种情况多么恶劣:

exec('select * from ' + @ServerName + '.ClientDatabase.dbo.Client')
看看同义词的用法

创建语法(从MSDN):


::=
{
[server_name.[database_name].[schema_name_2]。|
数据库名称。[schema_name_2]。| schema_name_2.]对象名称
}

你可以设置一个链接服务器,“鲍勃”说

然后可以调用sp_setnetname来更改底层目标服务器,但保留名称BOB

所以你的代码应该是:

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

好主意-适用于数量有限的服务器名称在我看来,此处的CREATE SYNONYM和sp_setnetname建议可能会对并发产生意外后果,因为这些操作具有全局影响。也就是说,如果两个这样的操作重叠,其中一个或两个操作可能会失败,并使服务器配置处于不一致的状态。您也需要删除链接的服务器,除非您只运行此SP一次。为什么?sp_setnetname允许您重新定义链接的服务器目标此服务器正在工作,sp_setnetname需要sysadmin和setupadmin服务器角色除外
CREATE PROCEDURE [dbo].[GetData]
        @ServerName
AS
BEGIN
    EXEC sp_setnetname 'BOB', @ServerName
    SELECT * FROM BOB.ClientDataBase.dbo.Client
END
-- 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 id=@id ORDER BY instanceName ASC;
 SET @RETURN=HOST_NAME()+''+@RETURN;
END;
GO

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





-- 

exec('SELECT * FROM ['+@RETURN+'].RemoteDatabase.dbo.SampleTable');