sql-server - Sql Server - 如何比较合并中两行的哈希值

标签 sql-server

我有几个工作表,我正在将它们合并成一个用于显示的最终表。如果显示表不包含从工作表(以下称为 src)编译的主键,则我将该行插入到显示中。这工作正常,下一部分让我感到困惑。

如果主键已在显示中,我只想在 src 行具有相同主键但至少有一列与显示行不同的情况下更新显示行。我想使用 MD5 算法的 HASHBYTES() 方法来实现这一点。

从 msdn 来看,语法应如下所示:HASHBYTES('MD5', {@variable | 'string'})

我希望能够在合并语句中执行类似的操作:

WHEN MATCHED AND HASHBYTES('MD5', display) != HASHBYTES('MD5', src) THEN ...(stuff)

如何完成 HASHBYTES 函数?

这是我当前的合并语句

MERGE dbo.DisplayCases AS display
USING (SELECT CaseId, Title, projects.ProjectName, categories.CategoryTitle, Root, milestones.MilestoneName,
        milestones.MilestoneDate, Priority, statuses.StatusTitle, EstimatedHours, ElapsedHours, personAssigned.Name as AssignedTo,
        personResolved.Name as ResolvedBy, cases.IsResolved, IsOpen, Opened, Resolved, Uri, ResolveUri,
        OutlineUri, SpecUri, ParentId, Backlog
        FROM fogbugz.Cases cases
        JOIN fogbugz.Projects projects ON cases.ProjectId = projects.ProjectId
        JOIN fogbugz.Categories categories ON cases.CategoryId = categories.CategoryId
        JOIN fogbugz.Milestones milestones ON cases.MilestoneId = milestones.MilestoneId
        JOIN fogbugz.Statuses statuses ON cases.Status = statuses.StatusId
        JOIN fogbugz.People personAssigned ON cases.AssignedTo = personAssigned.Id
        LEFT JOIN fogbugz.People personResolved ON cases.ResolvedBy = personResolved.Id
        ) as src
ON display.CaseId = src.CaseId
WHEN NOT MATCHED THEN
    INSERT(CaseId, CaseTitle, ProjectName, CategoryTitle, RootId, MilestoneName, MilestoneDate, Priority,
        StatusTitle, EstHrs, ElapsedHrs, AssignedTo, ResolvedBy, IsOpen, IsResolved, Opened, Resolved, Uri,
        ResolveUri, OutlineUri, Spec, ParentId, Backlog)
    VALUES(src.CaseId, src.Title, src.ProjectName, src.CategoryTitle, src.Root, src.MilestoneName,
        src.MilestoneDate, src.Priority, src.StatusTitle, src.EstimatedHours, src.ElapsedHours,
        src.AssignedTo, src.ResolvedBy, src.IsResolved, src.IsOpen, src.Opened, src.Resolved,
        src.Uri, src.ResolveUri, src.OutlineUri, src.SpecUri, src.ParentId, src.Backlog);

最佳答案

摘自马丁·史密斯的评论...

您可以执行WHEN MATCHED AND EXISTS(SELECT Source.* EXCEPT SELECT Target.*) THEN UPDATE ...

关于sql-server - Sql Server - 如何比较合并中两行的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17432125/

相关文章:

SQL Server,where 子句与不同类型的比较和默认转换行为

sql - 在 SQL Server 中查找去年的日期

c# - 为什么 Entity Framework 对具有事务和 RAISERROR 的存储过程抛出事务计数错误?

sql-server - 是否可以将 __MigrationHistory 系统表移至新服务器?

sql - 我可以使用更有效的查询吗

sql-server - SQL Server Management Studio 中的 "Favorites"或 "macros"?

sql-server - 优化跨多个表的全文搜索

sql - 如何从具有相似列名的不同不相关表中获取列?

SQL Server对unicode字符的唯一约束问题

SQL Server : coalesce, 阻止额外空间?