SQL Server - 远程目录上的存储过程

时间:2014-08-13 20:13:20

标签: sql sql-server stored-procedures remote-server

我有一个存储过程,根据服务器名称和默认目录设置远程数据库连接。这通常在我们在数据中心中部署服务期间调用,因此这些参数都不是高级已知的。

这是存储过程:

CREATE PROCEDURE [dbo].[p_SetupRemoteAdStore]
    @Catalog nvarchar(50) = N'Catalog_A', 
    @Server nvarchar(50) = N'localhost'
AS
BEGIN
    SET NOCOUNT ON;

    if not exists( select * from sys.servers where name = @Server )
        exec sp_addlinkedserver @server=@Server, @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=@Server, @catalog=@Catalog

    if not exists( select * from sys.servers where name = N'REMOTE_SERVER' )
        exec sp_addlinkedserver @server=N'REMOTE_SERVER', @srvproduct=N'SQL Server'

    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'collation compatible', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'data access', @optvalue=N'true'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'dist', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'pub', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'rpc', @optvalue=N'true'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'rpc out', @optvalue=N'true'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'sub', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'connect timeout', @optvalue=N'0'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'collation name', @optvalue=null
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'lazy schema validation', @optvalue=N'false'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'query timeout', @optvalue=N'0'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'use remote collation', @optvalue=N'true'
    EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'remote proc transaction promotion', @optvalue=N'false'
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'REMOTE_SERVER', @locallogin = NULL , @useself = N'True'
    EXEC sp_setnetname 'REMOTE_SERVER', @Server
END
GO

这部分工作正常。

部署完成后,我配置了远程连接,我可以调用这样的存储过程:

EXECUTE [REMOTE_SERVER].[Catalog_A].[dbo].[p_SomeSProc] @Arg1 = @arg1, ...

问题是Catalog_A在这里是硬编码的,我实际上并没有使用我在连接中配置的默认目录。

我尝试了不同的语法,但没有运气。

还可以选择使用OPENQUERY但不允许我在远程服务器上调用存储过程。

知道如何使用配置的初始目录在远程连接上调用存储过程吗?

2 个答案:

答案 0 :(得分:1)

您可以使用EXECUTE AT:

EXECUTE ('EXEC db1.dbo.yourSproc1') AT RemoteServer

答案 1 :(得分:1)

您可以在EXECUTE之前构建SQL字符串:

DECLARE @str VARCHAR(200)
SET @str= 'EXEC db1.'+@Catalog* +'.yourSproc1'
EXECUTE (@str) AT RemoteServer