Sql server 2008 r2 以最快、最可靠的方式比较两个表

Sql server 2008 r2 以最快、最可靠的方式比较两个表,sql-server-2008-r2,sql-update,Sql Server 2008 R2,Sql Update,我有两个表,其中有许多列,在许多情况下,这些列的值为空 比较两个表数据的最佳方法是什么 我使用以下方法: UPADTE TableB SET Col1 = A.Col1 FROM TableA A INNER JOIN TableB B ON A.Col2 = B.Col2 AND A.Col3 = B.Col3 .... A.Col47 = B.Col47 不知何故,我也可以写这篇文章,但正如您所知,SQL Server不能说NULL=NULL,当我在所有列上保留ISNULL函数时,查询需要

我有两个表,其中有许多列,在许多情况下,这些列的值为空

比较两个表数据的最佳方法是什么

我使用以下方法:

UPADTE TableB
SET Col1 = A.Col1
FROM TableA A INNER JOIN TableB B
ON A.Col2 = B.Col2 AND A.Col3 = B.Col3 .... A.Col47 = B.Col47
不知何故,我也可以写这篇文章,但正如您所知,SQL Server不能说NULL=NULL,当我在所有列上保留ISNULL函数时,查询需要20-30分钟

有没有办法更快更准确地完成同样的任务

[…]SQL Server不能说NULL=NULL,当我在所有列上保留ISNULL函数时,查询需要20-30分钟

这并非完全正确。出于此比较的目的,您可能需要。请注意,此功能可能不会在SQL Server的未来版本中提供,但至少在2012年之前都会提供

set ansi_nulls on
select 1 where 1 != null    -- returns nothing
select 1 where null = null  -- returns nothing
select 1 where null != null -- returns nothing

set ansi_nulls off
select 1 where 1 != null    -- returns 1
select 1 where null = null  -- returns 1
select 1 where null != null -- returns nothing

如果这不能解决您的性能问题,您可能希望研究索引或更好的硬件,以使查询更快地运行,或者返回到重新分析正在发生的事情,然后重构解决方案。乍一看,这似乎是一个不寻常的操作(在非常相似的表之间复制数据,但仅在所有这些数据的匹配上),但提供准确的表定义、要求和示例可能有助于帮助其他人看到可以更改的内容。

您是在比较还是在更新?您能保证这些表具有相同的列定义吗?这是一个很好的比较工具,还有其他的。@TimLehner这些表有相同的列,除了TableA有一列不在TableB中,TableB有两列不在TableA中。我必须在条件中使用的其他列具有相同的数据类型。我的团队不允许在SQL server以外的服务器上使用任何工具。我的客户没有心情为任何其他工具购买任何其他许可证:-(另外,当TableA的行与TABLEB匹配时,我需要更新TABLEB