代码之家  ›  专栏  ›  技术社区  ›  Liam neesan

如何创建动态查询来连接SQL Server中的不同服务器数据库?

  •  0
  • Liam neesan  · 技术社区  · 6 年前

    我想创建动态查询以访问不同的数据库服务器。

    例如,我试过的是

    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
    

    但它不起作用…

    1 回复  |  直到 6 年前
        1
  •  2
  •   Larnu    6 年前

    不能提供变量来替换对象的名称。例如,以下内容不起作用:

    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;
    

    如果语法错误,您最好的朋友将帮助您调试它。