сделать имя сервера в качестве переменной - PullRequest
6 голосов
/ 17 апреля 2009

Я пытаюсь получить данные от другого сервера, и имя сервера может измениться. Поэтому я установил имя сервера в качестве параметра. Идея моей процедуры sql store выглядит примерно так

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

Кто-нибудь знает, как этого добиться?

Версия базы данных sql server 2005

Ответы [ 4 ]

5 голосов
/ 17 апреля 2009

Используйте динамический SQL, как бы плохо это ни было:

exec('select * from ' + @ServerName + '.ClientDatabase.dbo.Client')
3 голосов
/ 17 апреля 2009

Вы можете настроить связанный сервер, говорит "BOB".

Затем вы можете вызвать sp_setnetname, чтобы изменить базовый целевой сервер, но сохранить имя BOB.

Итак, ваш код будет:

CREATE PROCEDURE [dbo].[GetData]
        @ServerName
AS
BEGIN
    EXEC sp_setnetname 'BOB', @ServerName
    SELECT * FROM BOB.ClientDataBase.dbo.Client
END
3 голосов
/ 17 апреля 2009

Посмотрите, как использовать синоним (ы)

Создать синтаксис (из MSDN):

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 голосов
/ 23 марта 2013
-- 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'); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...