如何仅更新SQL Server中的第一个字符

时间:2014-11-01 09:12:40

标签: sql-server sql-server-2008

我在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

3 个答案:

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

enter image description here

答案 2 :(得分:0)

根据 @chrisb旧答案,它适用于nvarchar(MAX)

UPDATE MyTable
SET No1 = '0' + SUBSTRING(No1, 2, LEN(No1) - 1)
WHERE No1 LIKE '1%'