首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server update语句不会更新表

SQL Server update语句不会更新表
EN

Stack Overflow用户
提问于 2015-10-10 02:44:56
回答 2查看 2K关注 0票数 0

我有一个运行server 2012企业版的服务器。两天前,为了测试迁移脚本,我对生产数据库进行了备份。它工作得很漂亮

更新2天的同一数据库今天失败了,因为我处理的第一步就是简单地更新一些记录。

代码语言:javascript
复制
 update TroopGirls 
 set gsusaid = '00000000000'+GSUSAID 
 where len(gsusaid) = 1

就是这样一种说法。

运行此声明时,每次都会显示更新的(61)记录。

我已经在一个事务框架内运行了它,使用了一个commit语句,使用了go语句,扰乱了事务隔离级别,所有这些都是徒劳的。

数据库中任何地方都没有锁,对该数据库运行的唯一进程是查询窗口。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-10 03:24:16

如果gsusaidvarchar/nvarchar列,则CONCAT函数将用于更新它。

代码语言:javascript
复制
update TroopGirls 
set gsusaid = CONCAT('00000000000', GSUSAID)
where len(gsusaid) = 1
票数 0
EN

Stack Overflow用户

发布于 2015-10-10 02:55:01

我要在黑暗中尝试一下,猜测gsusaids是某种数字数据类型。请考虑以下几点:

代码语言:javascript
复制
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,可以这样做:

代码语言:javascript
复制
SELECT FORMAT(gsusaid, '000000000000') FROM TroopGirls

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33049711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档