我在MyTable中有以下数据
ID = 1, No1 = 23, No2 = 45, D = 1
ID = 2, No1 = 12, No2 = 5, D = 1
ID = 3, No1 = 14, No2 = 4, D = 1
ID = 4, No1 = 41, No2 = 12, D = 1
ID = 5, No1 = 2, No2 = 25, D = 1
ID = 6, No1 = 3, No2 = 96, D = 1
我想只更新第一列的第一个字符,如果它是1那么它应该是0 如下
ID = 1, No1 = 23, No2 = 45, D = 1
ID = 2, No1 = 02, No2 = 5, D = 1
ID = 3, No1 = 04, No2 = 4, D = 1
ID = 4, No1 = 41, No2 = 12, D = 1
ID = 5, No1 = 2, No2 = 25, D = 1
ID = 6, No1 = 3, No2 = 96, D = 1
现在我使用C#来执行此操作,我打开No1
来自MyTable
的所有记录并使用loop
手动检入C#如果我找到第一个字符为1然后我创建字符串并更新数据库..它正在工作,但问题是10000 X 100
Mytable
中有No1
记录,因此每次循环将运行10000 X 100次,结果是应用程序性能低下,
我只想问一下“有没有任何方法只使用SQL和C#来更新{{1}} coloumn的第一个字符......
更新: MyTable的所有数据类型都是int
答案 0 :(得分:2)
鉴于我们知道值范围为0到9999,查询可能如下所示:
update MyTable
set No1 = CASE WHEN No1 between 10 and 19 THEN No1 - 10
WHEN No1 between 100 and 199 THEN No1 - 100
WHEN No1 between 1000 and 1999 THEN No1 - 1000 END
where No1 between 10 and 19
or No1 between 100 and 199
or No1 between 1000 and 1999
如果它经常运行,你可能需要考虑添加适当的索引等,但快速测试表明它并不太糟糕。
答案 1 :(得分:1)
如果No1的数据类型是INT,那么如果您发现并替换值以1开头,则SQLServer会将值存储为2(如果12而不是02)。
update #MyTable set No1 = case when left(No1,1) = 1 then stuff(NO1,1,1,0) else No1 end --Update
答案 2 :(得分:0)
根据 @chrisb旧答案,它适用于nvarchar(MAX)
,
UPDATE MyTable
SET No1 = '0' + SUBSTRING(No1, 2, LEN(No1) - 1)
WHERE No1 LIKE '1%'