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

时间:2018-09-20 08:45:19

标签: sql sql-server stored-procedures

我想创建动态查询以访问其他数据库服务器。

例如,我尝试过的是

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 个答案:

答案 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;

如果语法不太正确,您最好的朋友会帮助您调试它。