SQL Server更新语句不会更新表

时间:2015-10-10 02:44:56

标签: sql-server database tsql

我有一台运行企业版SQL Server 2012的服务器。我在2天前对生产数据库进行了备份,以测试我的迁移脚本。它运作得很漂亮

SAME数据库今天2天更新失败,因为我的流程的第一步是简单地更新一些记录。

 update TroopGirls 
 set gsusaid = '00000000000'+GSUSAID 
 where len(gsusaid) = 1

是一个这样的陈述。

运行此语句将每次更新(61)记录

我在一个带有提交的事务框架中运行它,使用了go语句,搞乱了事务隔离级别,但都无济于事。

数据库中没有任何锁,并且针对此数据库运行的唯一进程是查询窗口。

右键点击表格并说出“编辑前200行”。确实有效。问题是我必须在许多表和模式中更新750k记录范围内的内容。

2 个答案:

答案 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

如果您需要以该格式存储,则应确保数据类型为VARCHARNVARCHAR - 但如果它实际上是数字数据,那么您最好保持数字然后让应用程序/用户/报告按需要格式化(使用任意数量的前导零)。此外,更改列上的数据类型可能会破坏其他工件或应用程序。

答案 1 :(得分:0)

如果" gsusaid"是varchar / nvarchar列,CONCAT函数将用于更新它。

update TroopGirls 
set gsusaid = CONCAT('00000000000', GSUSAID)
where len(gsusaid) = 1