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

时间:2018-11-15 21:08:45

标签: sql-server tsql

我想知道,有可能使这项工作可行吗?

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)

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

1 个答案:

答案 0 :(得分:4)

执行远程数据库的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')是邪恶,邪恶,邪恶。