使服务器名称作为变量
问题描述:
我想从不同的服务器获取数据,并且服务器名称可能会更改。所以我将服务器名称设置为参数。我的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
}
答
你可以设置一个链接服务器,说“BOB”。
然后,您可以调用sp_setnetname来更改底层目标服务器,但保留名称BOB。
所以,你的代码是:
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 [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');
好idea- Works的服务器名称 – gbn 2009-04-17 11:28:53
数量有限在我看来,无论是CREATE SYNONYM和sp_setnetname建议在这里可能有意想不到的后果因为这些操作具有全球效应。也就是说,如果两个此类操作重叠,则一个或两个操作可能会失败,并使服务器配置处于不一致状态。 – 2010-04-16 18:51:55