我想创建动态查询以访问其他数据库服务器。
例如,我尝试过的是
CREATE PROC spDifferentServer
@Server1 int,
@Server2 int
AS
BEGIN
Declare @Server1IP varchar[MAX] = ''
SELECT CASE WHEN @Server1 = '777' THEN SET @Server1IP = '[192.168.164.8].[Employee].[dbo].' ELSE '' END
Declare @Server2IP varchar[MAX] = ''
SELECT CASE WHEN @Server2 = '888' THEN SET @Server1IP = '[192.168.131.8].[Employee].[dbo].' ELSE '' END
SELECT
d1.Name
FROM
@Server1IP +''+[Details] d1
WHERE
Not Exists (
SELECT 1
FROM @Server2IP +''+[Details] d2
WHERE d2.ID = d1.ID
)
END
但这不起作用...
答案 0 :(得分:2)
您不能提供变量来替换对象的名称。例如,以下操作将无效:
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;
如果语法不太正确,您最好的朋友会帮助您调试它。