我有一个运行server 2012企业版的服务器。两天前,为了测试迁移脚本,我对生产数据库进行了备份。它工作得很漂亮
更新2天的同一数据库今天失败了,因为我处理的第一步就是简单地更新一些记录。
update TroopGirls
set gsusaid = '00000000000'+GSUSAID
where len(gsusaid) = 1就是这样一种说法。
运行此声明时,每次都会显示更新的(61)记录。
我已经在一个事务框架内运行了它,使用了一个commit语句,使用了go语句,扰乱了事务隔离级别,所有这些都是徒劳的。
数据库中任何地方都没有锁,对该数据库运行的唯一进程是查询窗口。
右击该表并说“编辑前200行”确实有效。问题是,我必须在许多表和模式中更新750 k记录范围内的内容。
发布于 2015-10-10 03:24:16
如果gsusaid是varchar/nvarchar列,则CONCAT函数将用于更新它。
update TroopGirls
set gsusaid = CONCAT('00000000000', GSUSAID)
where len(gsusaid) = 1发布于 2015-10-10 02:55:01
我要在黑暗中尝试一下,猜测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 --但如果它实际上是数字数据,则最好将其保留为数字,并让应用程序/用户/报表按他们想要的格式格式化(使用任何数量的前导零)。此外,更改列上的数据类型可能会破坏其他工件或应用程序。
https://stackoverflow.com/questions/33049711
复制相似问题