我有一个存储过程,根据服务器名称和默认目录设置远程数据库连接。这通常在我们在数据中心中部署服务期间调用,因此这些参数都不是高级已知的。
这是存储过程:
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
但不允许我在远程服务器上调用存储过程。
知道如何使用配置的初始目录在远程连接上调用存储过程吗?
答案 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