不能提供变量来替换对象的名称。例如,以下内容不起作用:
DECLARE @o nvarchar(255) = N'sys.objects';
SELECT *
FROM @o;
您需要创建动态SQL并执行它。例如:
DECLARE @s sysname N'dbo', @t sysname = N'objects';
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT * FROM ' + QUOTENAME(@s) + N'.' + QUOTENAME(@o) + N';';
EXEC sp_executesql @SQL;
对于您所拥有的,这将导致类似这样的结果(这是未经测试的):
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT d1.[Name]' + NCHAR(10) +
N'FROM ' + @Server1IP + N'[Details] d1' + NCHAR(10) +
N'WHERE NOT EXISTS (SELECT 1' + NCHAR(10) +
N' FROM ' + @Server2IP + N'[Details] d2' + NCHAR(10) +
N' WHERE d1.ID = d2.ID);';
PRINT @SQL; --Your best friend
EXEC sp_executeSQL @SQL;
如果语法错误,您最好的朋友将帮助您调试它。