一家公司使用 SQL Server 数据库来存储有关其客户及其业务交易的信息。您所在的城市引入了新的区号。对于前缀小于 500 的电话号码,区号 111 保持不变。前缀为 500 及以上的号码将分配区号 222。客户表中电话列中的所有电话号码都存储为以下格式的 char(12) 字符串:“999-999-9999”。我必须对客户表进行适当的更改
使用最少的管理工作尽快完成。我应该使用哪一个?
a.
UPDATE Customers SET Phone = ‘222-‘ + SUBSTRING(Phone,5,8)
FROM Customers WHERE SUBSTRING(Phone,1,3) = ‘111’
AND SUBSTRING(Phone,5,3) >= 500
b.
DECLARE PhoneCursor CURSOR FOR
SELECT Phone FROM Customers
WHERE SUBSTRING(Phone,1,3) = 111
AND SUBSTRING(Phone,5,3) >= 500
OPEN PhoneCursor
FETCH NEXT FROM PhoneCursor
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Customers
SET Phone = ‘222’ + SUBSTRING(Phone,5,8)
WHERE CURRENT OF PhoneCursor
FETCH NEXT FROM PhoneCursor
END
CLOSE PhoneCursor
DEALLOCATE PhoneCursor
大更新将在数据库中保留一个事务,可能会持续很长一段时间……锁定事物并造成各种破坏。
为此,我建议使用游标来将负载分布在一段时间内。
我还进行了“分块”更新...如下所示:
DECLARE @Done bit = 0
WHILE @Done = 0
BEGIN
UPDATE TOP(10000)
Customers SET Phone = ‘222-‘ + SUBSTRING(Phone,5,8)
FROM Customers WHERE SUBSTRING(Phone,1,3) = ‘111’
AND SUBSTRING(Phone,5,3) >= 500
IF @@ROWCOUNT = 0
BEGIN
SET @Done = 1
END
END
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)