Sql server 动态比较链接SQL服务器上的表

Sql server 动态比较链接SQL服务器上的表,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我必须比较表SIB$以获得两个不同链接服务器上相同的LATESTDUMP和OLDDUMP上不匹配的记录。我已经尝试创建一个动态查询。有人能帮我做以下几件事吗 1是否有一种方法,我不必将列名传递给代码,代码会动态获取列名,并将其用作列列表进行比较。 所以我所要做的就是将两个表名传递给存储的进程 我工作过的代码: DECLARE @sql nvarchar(max) = ' ((SELECT * FROM LATESTDUMP...SIB$) t1 FULL OUTER JOIN (SELECT

我必须比较表SIB$以获得两个不同链接服务器上相同的LATESTDUMP和OLDDUMP上不匹配的记录。我已经尝试创建一个动态查询。有人能帮我做以下几件事吗 1是否有一种方法,我不必将列名传递给代码,代码会动态获取列名,并将其用作列列表进行比较。 所以我所要做的就是将两个表名传递给存储的进程

我工作过的代码:

DECLARE @sql nvarchar(max) = ' ((SELECT  * FROM LATESTDUMP...SIB$) t1 FULL 
OUTER JOIN (SELECT * FROM OLDDUMP...SIB$) t2
ON t1.id = t2.id
WHERE
t1.id IS NULL OR
t2.id IS NULL)'

SELECT  @sql += ' or t1.' + quotename(column_name) + ' <> t2.' + 
quotename(column_name) from information_schema.columns where table_name = 
'SIB$'

看起来您可能需要查看自SQL 2008以来可用的MERGE语句。
这里有一些代码可以帮助您开始。它提取出一个主键,该主键假定为一列主键,这对您来说可能是有效的假定,也可能不是有效的假定,并获取剩余列的逗号分隔字符串列表

从这里,您可以使用splitstring构建一个sql字符串,该字符串将主键上的硬编码链接服务器中的两个同名表连接起来,比较每一列的差异,然后执行动态sql。我已经包括了一些测试脚手架,因此您可以通过:

   DECLARE @tableName sysname;
   SET @tableName = 'some table'

    -- Validate parameter
    IF @tableName IS NULL OR NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName AND TABLE_TYPE = 'BASE TABLE')
    BEGIN
        RAISERROR ('Invalid table name specified', 16, 1);
        RETURN;
    END;

    -- Validate table has a primary key
    IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @tableName)
    BEGIN
        RAISERROR ('Specified table does not have a primary key', 16, 1);
        RETURN;
    END;

    -- Get info about the Primary Key columns
    DECLARE @pkcolName sysname;
    SELECT @pkcolName = c.COLUMN_NAME 
      FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
           INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
           INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON kcu.TABLE_NAME = c.TABLE_NAME AND kcu.COLUMN_NAME = c.COLUMN_NAME
     WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY' AND tc.TABLE_NAME = @tableName AND kcu.ORDINAL_POSITION = 1

    -- Grab the names of all the remaining columns
    DECLARE @nonKeyColumns nvarchar(MAX);
    SELECT @nonKeyColumns = STUFF ( ( SELECT N'], [' + c.name
                FROM sys.columns c
               WHERE object_id = (select top 1 object_id FROM sys.objects where name = @tableName) 
                 AND c.name <> @pkcolName 
               ORDER BY c.column_id
                 FOR XML PATH('')), 1, 2, '') + ']';

SELECT @pkcolName 
SELECT @nonKeyColumns

请不要使用不适用于您的问题的标记当我有静态列或固定列时,完整的外部联接对我来说非常有效,但我的表中有大约200-220列,它们的列名不断变化。这就是为什么我想使用动态SQL的原因。这段代码似乎不适用于链接服务器。。你能不能检查一下,让我知道这个代码只是一个工具包,为你建立你需要的。当然,它不适用于链接服务器,因为它只是一个如何获取信息的示例。我不知道链接服务器的名称。只需添加这些服务器名称即可获取正确的信息。这是供您在本地测试的。例如:MyLinkedServer.INFORMATION\u SCHEMA.TABLE\u约束和MyLinkedServer.sys.objects。