sql - 比较两个 T-SQL 表的差异

标签 sql sql-server tsql

我有同一个数据库的两个实例。第一个数据库代表今天的数据,第二个数据库代表 6 个月前的数据。我需要查找特定表中条目子集的差异。

对于 ID 在两个表中都存在的条目,我想找到一种方法来仅查看不相同的行。

有什么想法吗?

谢谢

最佳答案

SELECT t1.id
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id
WHERE ISNULL(t1.field1,'') <> ISNULL(t2.field1,'')
      OR ISNULL(t1.field2,'') <> ISNULL(t2.field2,'')
      OR ...

要生成长 WHERE 部分,您可以使用此函数:

CREATE PROCEDURE compareTables
    @db1    NVARCHAR(100),
    @table1 NVARCHAR(100),
    @db2    NVARCHAR(100),
    @table2 NVARCHAR(100)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @where NVARCHAR(MAX)
    DECLARE @cmd NVARCHAR(MAX)

    SET @where = ''

    SELECT @where = @where + 'ISNULL(t1.' + name + ','''') <> ISNULL(t2.' + name + ','''') OR ' 
    FROM sys.columns WHERE object_id = OBJECT_ID(@table1)

    SET @where = SUBSTRING(@where,1,LEN(@where)-3)

    SET @cmd = 'SELECT t1.id FROM ' + @db1 + '.' + @table1 + ' t1 '
    SET @cmd = @cmd + 'INNER JOIN ' + @db2 + '.' + @table2 + ' t2 ON t1.id = t2.id '
    SET @cmd = @cmd + 'WHERE ' + @where

    EXEC sp_executesql @cmd
END
GO

使用示例:

EXEC compareTables 'db1_name','dbo.table1','db2_name','dbo.table1'

记住将架构放在表名称中。

关于sql - 比较两个 T-SQL 表的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1473073/

相关文章:

mysql - Concat 在 MySQL 中不起作用

sql-server - sp_who2 BlkBy 休眠进程等待命令

sql-server - 使用 VB.NET 后端编写网站,无需 ASP.NET

sql-server - 如何在SQL Server中创建RowNum列?

sql - 如何使用 JOIN 从表中获取最新行

sql-server - 防止 SQL Server 生成的 XML 中的自闭合标记

python - PyODBC 迭代更新 - "Not a Query"

java - 数据库延迟获取

MySql 搜索两列同一个表按第一列排序

mysql - 查找购买最多的产品