这是我在这里的第一个问题,所以请对我轻松点:)....我尝试在网上搜索,以及这里的其他已回答的问题,但我想不出一个好方法这个词足够短,足以让 Google 找到任何好的匹配项。对我来说这似乎是一个 T-SQL 101 问题。
我的问题是,在T-SQL中,执行更新时,如果新值等于当前值,是否仍执行写入(即工作完成了吗?)。
在我的工作中,当我们进行更新/合并时,很多时候我们会使用如下代码来进行更新(请记住,通常合并/更新是针对多列,而不仅仅是一列,就像这样示例):
[列] =
案件
WHEN ISNULL(source.[Column],'') = '' THEN target.[Column]
其他来源。[专栏]
结束
或者像这样
[Column]= COALESCE(NULLIF(source.[Column], ''),target.[Column])
所以,换句话说,如果源列值为空,则将其设置为目标列值...我一直很好奇 T-SQL 是否足够聪明来说...嘿...他们只是想把它设置为自己,管它呢。
此外,这可以分为两个问题...... 如果新值等于目标值,则执行工作,其中...
- 新值是否引用目标值? (意思是,TSQL 是否足够聪明,可以看到它是对自身的引用)
- 新值等于源值吗?
我希望这不是太复杂和深思熟虑。
最佳答案
根据 SQL Server Profiler 对一些实验性 UPDATE
语句的跟踪来看,是的,工作已经执行,但数据库引擎正如预期的那样非常智能。
实验性UPDATE
语句
我在 4 次运行中跟踪了 SQL Server Profiler 中的以下每个 UPDATE
语句,以稍微不同的顺序运行它们,以最大限度地减少其执行顺序作为跟踪结果的一个因素:
更新
1
update [table]
set CustomerName = CustomerName
where CustomerName = 's/O'; -- value changed from 's/O' to 'o/S' on some runs
更新
2
update [table]
set CustomerName = 's/O' -- value changed from 's/O' to 'o/S' on some runs
where CustomerName = 's/O'; -- value changed from 's/O' to 'o/S' on some runs
更新
3
update [table]
set CustomerName = 'o/S' -- value changed from 'o/S' to 's/O' on some runs
where CustomerName = 's/O'; -- value changed from 's/O' to 'o/S' on some runs
根据我在每个 UPDATE
旁边的评论,我在运行期间在 's/O'
和 'o/S'
之间翻转为每次运行提供一个实际影响我的目标表[table]
的值。我可以在每次运行后重置表中的值,但这正是我碰巧这样做的。
SQL Server Profiler 跟踪结果
放大浏览器可能会更容易阅读以下屏幕截图中的数字。屏幕截图后面还提供了每个 UPDATE
语句执行的平均工作的更易于阅读的文本摘要。
运行 1(更新
1、更新
2、更新
3)
这次运行是一次热身。 SQL Server 之前在我的机器上处于闲置状态:所以对此持保留态度。
运行 2(更新
3、更新
1、更新
2)
运行 3(更新
3、更新
2、更新
1)
运行 4(更新
1、更新
2、更新
3)
运行 1-4 分析
运行 2-4 次平均值:
Update # CPU Reads Writes Duration
-------- --- ----- ------ --------
1 0.00 13.00 1.00 11.33
2 0.00 2.33 1.00 6.67
3 0.00 17.33 1.00 20.00
关于sql - T-SQL - 更新未更改的值,是否已执行工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22725650/