我有一个充满更新的事务,如下所示:
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;