首页 > 解决方案 > 如何创建动态查询以连接 SQL Server 中的不同服务器数据库?

问题描述

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

例如,我尝试过的是

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

但它不起作用...

标签: sqlsql-serverstored-procedures

解决方案


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

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;

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


推荐阅读