在链接服务器上运行动态查询

Eri*_*aus 0 t-sql sql-server

我想知道,这项工作有可能实现吗?

declare @SQL varchar(max),
@query varchar(max) ='select * from Table'

select @SQL='USE LinkedServer.DBName ' + @query'

exec (@SQL)
Run Code Online (Sandbox Code Playgroud)

'USE'如果您用于在同一服务器上运行查询,但不能在链接服务器上运行查询,则它可以正常工作。

我想要的是创建将在不同服务器和数据库上运行一些动态查询的过程,并且我想将 ServerName 和 DBName 作为参数传递给该 sp。

注意:我不想这样使用它:

declare @SQL varchar(max)    
select @SQL='
select * from LinkedServer.DBName..Table'

exec (@SQL)
Run Code Online (Sandbox Code Playgroud)

由于该 select 语句将从表中检索

Aar*_*and 5

当然,执行远程数据库的鲜为人知的技巧sp_executesql

DECLARE @LinkedServer sysname = N'LinkedServer', 
        @DatabaseName sysname = N'DBName';

-- above are input params

DECLARE @exec nvarchar(4000), @sql nvarchar(max);

SET @sql = N'SELECT * FROM dbo.Table;';
-- or SELECT @sql = DynamicSQL FROM dbo.SomeLocalTable WHERE...

SET @exec = QUOTENAME(@LinkedServer) + N'.' 
          + QUOTENAME(@DatabaseName)
          + N'.sys.sp_executesql';

EXEC @exec @sql;
Run Code Online (Sandbox Code Playgroud)

不要使用括号。EXEC('string')是邪恶,邪恶,邪恶。