2017-04-17 77 views
0

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

代码,我的工作:

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$' 
+0

请不要使用不适用于您的问题 –

回答

0

这里有一些代码让你开始。它提取一个主键(假设一列主键,这可能是或者可能不是你的有效假设),并且抓取剩余列的逗号分隔字符串列表。

从这里您可以使用拆分字符串构建一个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 
+0

此代码似乎不适用于链接服务器..您可以请检查并让我知道 – Nadeem

+0

此代码只是一个工具包,供您构建您所需的内容。当然,它不适用于链接服务器,因为它只是一个如何提取信息的例子。我不知道你的链接服务器的名字是什么。只需添加这些服务器名称即可获取适当的信息。这适用于本地测试。 (例如:MyLinkedServer.INFORMATION_SCHEMA.TABLE_CONSTRAINTS和MyLinkedServer.sys.objects)。 – pmbAustin