我正在连接两个数据库进行数据迁移。我想检查第二个数据库中是否存在第一个数据库表中的记录。如何在SQL Server 2005中编写INSERT IF NOT EXISTS查询
I.e.从源数据库用户表我希望将数据迁移到目标数据库用户表。
如何使用if not exists来编写查询?
我正在连接两个数据库进行数据迁移。我想检查第二个数据库中是否存在第一个数据库表中的记录。如何在SQL Server 2005中编写INSERT IF NOT EXISTS查询
I.e.从源数据库用户表我希望将数据迁移到目标数据库用户表。
如何使用if not exists来编写查询?
SQL2003定义MERGE
,否则你可以做一个INSERT INTO ... SELECT
并在SELECT
你应该LEFT JOIN
使用在ON
谓语自然键的目标表,然后就在WHERE <column> IS NULL
卡盘。
+1的支持,但看起来像现在编辑的问题是指SQL Server 2005而不是“标准SQL” – 2011-05-21 10:56:56
SQL Server 2005没有MERGE命令。 ... – 2011-05-21 12:10:20
我的答案不是特定于SQL Server的。 – 2011-05-22 00:47:12
insert into myTable
select * from myOldTable ot
where NOT EXISTS (select 1 from mytable t where t.ID = ot.ID)
您可能会更好写它作为加入
insert into myTable
select ot.*
from myOldTable ot
LEFT JOIN mtTable t
ON ot.ID = t.ID
WHERE t.ID IS NULL
,或者根据您的数据库,合并可能会更好,有很多的选择
这两种情况都存在竞争条件的可能性,因此OP需要一个唯一的约束或额外的锁定提示。 – 2011-05-21 10:57:29
@Martin,你说得对,加上WITH(SERIALIZABLE,UPDLOCK)'应该可以解决这个问题,我相信 – 2011-05-21 11:02:58
其实刚刚注意到Andomar的观点,即这是为了数据迁移,所以OP可能不需要担心这一点。 – 2011-05-21 11:05:05
我发现下面的语法简单阅读:
insert TargetTable
(col1, col2)
from SourceTable as source
where not exists
(
select *
from TargetTable as duplicate
where source.col1 = duplicate.col1
and source.col2 = duplicate.col2
)
通常,您不必担心数据迁移过程中的并发性。如果这样做,您可以指定锁定提示,如with (tablock)
或更高transaction isolation level
。或者,您可以按照建议使用merge
,但这有一个相当复杂的语法。
谢谢andomar..this是我搜索的.. – ammu 2011-05-22 06:10:32
select * from db1.schema1.table1
intersect
select * from db2.schema2.table2
以及如何和在哪里**插入**新行??? – 2011-05-21 12:10:47
哪个版本的标准SQL? “合并”是标准SQL,但不受所有RDBMss – 2011-05-21 10:51:03