2009-04-17 21 views
6

Estoy tratando de obtener datos de diferentes servidores, y el nombre del servidor podría cambiar. Entonces configuro el nombre del servidor como un parámetro. La idea de mi procedimiento de almacenamiento sql es algo como estohacer el nombre del servidor como una variable

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

¿Alguien sabe cómo lograr esto?

La versión de base de datos es SQL Server 2005

Respuesta

5

uso de SQL dinámico, sin embargo el mal esto puede ser:

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

buscar en el uso Sinónimo (s)

Crear sintaxis (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

buena idea-funciona para un número limitado de nombres de servidores – gbn

+0

Me parece que tanto el sinónimo y las sugerencias sp_setnetname cree aquí que podría tener consecuencias no deseadas con concurrencia ya que las operaciones tienen un efecto global. Es decir, si dos de estas operaciones se superpusieron, una o ambas operaciones podrían fallar y dejar la configuración del servidor en un estado incoherente. –

3

Puede configurar un servidor vinculado, dice "BOB".

A continuación, puede llamar a sp_setnetname para cambiar el servidor de destino subyacente, pero mantener el nombre BOB.

lo que el código sería:

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

Debería soltar el servidor vinculado también, a menos que ejecute este SP solo una vez. –

+0

¿Por qué? sp_setnetname le permite redefinir el destino del servidor vinculado – gbn

+0

este funciona, excepto que sp_setnetname requiere los roles del servidor sysadmin y setupadmin – ren

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