我想知道,有可能使这项工作可行吗?
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语句
答案 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')
是邪恶,邪恶,邪恶。