首页 > 解决方案 > 在链接服务器上运行动态查询

问题描述

我想知道,是否有可能使这项工作?

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

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

exec (@SQL)

如果您用于'USE'在同一台服务器上运行查询,但不能在链接服务器上运行,它工作得很好。

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

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

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

exec (@SQL)

由于该选择语句将从表中检索

标签: sql-servertsql

解决方案


当然,执行远程数据库的鲜为人知的技巧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;

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


推荐阅读