所以这里是一个方法:
1.) Do a equi join
Table1
FirstName LastName PrimaryKey
Jay Donner 1
Steven Woods 2
Bruce Beard 3
Table2
Firstname LastName PrimaryKey
Jay Donner 1
Steven Wood 2
Bruce Bears 3
所以内连接
Select A.FirstName,A.LastName,A.PrimaryKey
From Table1 A INNER JOIN Table2 B
On A.FirstName = B.FirstName
AND A.LastName = B.LastName
现在的结果集将匹配字段 杰伊·唐纳1
既然你想找到与 不匹配的字段可以使用'not in'命令使用子查询,如下所示:
Select A.FirstName,A.LastName,A.PrimaryKey
From Table1 A INNER JOIN Table2 B
ON A.PrimaryKey =B.PrimaryKey
Where A.PrimaryKey NOT IN (
Select A.PrimaryKey
From Table1 A INNER JOIN Table2 B
On A.FirstName = B.FirstName
AND A.LastName = B.LastName
)
因此,上面的查询指出:找到主键匹配并且属性与名字和姓氏字段中的值不匹配的东西。
Steven Woods 2
Bruce Bear 3
现在您知道需要更新的主键。接下来,用update语句遍历表。光标是一块蛋糕,但我想有人告诉你在这里使用CTE递归。祝你好运......这就是我讨厌SQL的原因。 这是一个使用游标递归的例子...因此,我个人将使用Entity Framework的c#执行此任务,并将其作为可执行命令与SSIS包一起包装在我的SQL Server中。 反正!下面是迭代。
这里的示例代码没有评论。
申报@fname如为nvarchar(50)
Declare @LName as nvarchar(100)
声明@PrimaryKeyas诠释
Declare PersonCursor CURSOR FAST_FORWARD FOR
Select A.FirstName,A.LastName,A.PrimaryKey
From Table1 A INNER JOIN Table2 B
ON A.PrimaryKey =B.PrimaryKey
Where A.PrimaryKey NOT IN (
Select A.PrimaryKey
From Table1 A INNER JOIN Table2 B
On A.FirstName = B.FirstName
AND A.LastName = B.LastName
)
OPEN PersonCursor
FETCH NEXT FROM PersonCursor
INTO @FName, @LName, @Email
WHILE @@FETCH_STATUS = 0
BEGIN
-- do row specific stuff here
UPDATE table2
SET [EmployeeIdentification]= @Fname, [email protected]
WHERE [email protected]
FETCH NEXT FROM PersonCursor
INTO @FName, @LName, @Email
END
CLOSE PersonCursor
DEALLOCATE PersonCursor
出于好奇,你为什么不使用像NHibernate的或实体框架的ORM,因为他们会解决这些问题给你。 – Dai
@Dai因为我有6个星期的时间来编写一个相当庞大的数据应用程序,并且在记录所有内容时编写一份报告来启动。所以我没有考虑过。这是一个原型,所以我可以随时切换到实体或nHibernate^_^ – OmniOwl