我有一台运行企业版SQL Server 2012的服务器。我在2天前对生产数据库进行了备份,以测试我的迁移脚本。它运作得很漂亮
SAME数据库今天2天更新失败,因为我的流程的第一步是简单地更新一些记录。
update TroopGirls
set gsusaid = '00000000000'+GSUSAID
where len(gsusaid) = 1
是一个这样的陈述。
运行此语句将每次更新(61)记录
我在一个带有提交的事务框架中运行它,使用了go语句,搞乱了事务隔离级别,但都无济于事。
数据库中没有任何锁,并且针对此数据库运行的唯一进程是查询窗口。
右键点击表格并说出“编辑前200行”。确实有效。问题是我必须在许多表和模式中更新750k记录范围内的内容。
答案 0 :(得分:1)
我将在黑暗中采取刺戳,并猜测gsusaids
是某种数值数据类型。请考虑以下事项:
DECLARE @t table (i int, v varchar(10));
INSERT @t values (1, '1'), (10, '10'), (100,'100');
SELECT * FROM @t
-- i v
--======
-- 1 1
-- 10 10
-- 100 100
SELECT LEN(i), len(v) FROM @t
-- i v
--======
-- 1 1
-- 2 2
-- 3 3
UPDATE @t SET i = '000' + i WHERE LEN(i) = 1
-- 1 row affected
UPDATE @t set v = '000' + v WHERE LEN(v) = 1
-- 1 row affected
UPDATE @t set i = '000' + i WHERE LEN(i) = 1
-- 1 row affected - because int doesn't keep the leading zeroes
UPDATE @t set v = '000' + v WHERE LEN(v) = 1
-- 0 rows affected - because the varchar column got updated already.
SELECT * FROM @t
-- i v
--======
-- 1 001
-- 10 10
-- 100 100
换句话说,除非gsusaid
是某种字符类型,否则它不会保留前导0
。
如果您需要使用前导零打印/选择gsusaid
,您可以执行以下操作:
SELECT FORMAT(gsusaid, '000000000000') FROM TroopGirls
如果您需要以该格式存储,则应确保数据类型为VARCHAR
或NVARCHAR
- 但如果它实际上是数字数据,那么您最好保持数字然后让应用程序/用户/报告按需要格式化(使用任意数量的前导零)。此外,更改列上的数据类型可能会破坏其他工件或应用程序。
答案 1 :(得分:0)
如果" gsusaid"是varchar / nvarchar列,CONCAT函数将用于更新它。
update TroopGirls
set gsusaid = CONCAT('00000000000', GSUSAID)
where len(gsusaid) = 1