为什么在多次执行和提交同一事务后,行会受到影响



我有一个充满更新的事务,如下所示:

BEGIN TRANSACTION updateCompanyNames;
UPDATE Companies 
SET name = 'abc Inc.' 
WHERE name = 'abc inc';
...
COMMIT TRANSACTION updateCompanyNames

我提交了事务,但当我重新执行它时,一些行没有受到影响,正如人们所期望的那样,但其他行仍然有相同数量的行受到影响,无论我执行事务和提交了多少次。

您似乎使用了不区分大小写的排序规则,因此每次运行查询时都会有相同的行符合条件。UPDATE后面的行计数反映了符合条件的行数,即使当前列值没有更改。但是,SQL Server实际上并没有更新未更改的行作为优化。

使用COLLATE子句可用于强制进行区分大小写的比较。指定当前列排序规则的区分大小写的版本。例如,对于Latin1_General_CI_AS列排序规则,指定Latin1_General_CS_AS:

UPDATE Companies 
SET name = 'abc Inc.' 
WHERE 
name = 'abc inc' COLLATE Latin1_General_CS_AS;

上述查询的缺点是表达式不可扫描,因此即使列上存在索引,也需要扫描。还可以通过包含不区分大小写的标准来提高性能和并发性。不区分大小写的谓词将有助于索引查找可能需要更新的行,而区分大小写谓词将行限制为按大小写不同的行。

UPDATE Companies 
SET name = 'abc Inc.' 
WHERE 
name = 'abc inc'
AND name = 'abc inc' COLLATE Latin1_General_CS_AS;

相关内容

最新更新