SQL:在循环内更新行

时间:2011-10-15 10:59:04

标签: sql tsql

我正在尝试删除以空格开头的姓氏中的第一个字符。下面的代码似乎完全清除姓氏,使该字段为空。你看错了吗?

DECLARE @Id int
DECLARE @LastName NVARCHAR(255)

while (SELECT COUNT(*) FROM [Table] WHERE LastName LIKE ' %') > 0
Begin

    Select Top 1 @Id = Id, @LastName = LastName FROM [Table] WHERE LastName LIKE ' %'
    UPDATE [Table] SET LastName = SUBSTRING(@LastName, 1, LEN(@LastName)) WHERE Id = @Id
End

2 个答案:

答案 0 :(得分:3)

对我而言,您发布的代码在无限循环中运行。

LastName = SUBSTRING(LastName, 1, LEN(LastName))除了删除右尾随空格(因为LEN不计算)之外没有任何效果。要删除最左侧的字符,您需要SUBSTRING(LastName, 2, LEN(LastName) - 1)

但是,你不需要RBAR(Row By Agonizing Row)循环,只需使用

UPDATE [Table]
SET LastName = LTRIM(LastName) 
WHERE LastName  LIKE ' %'

以基于集合的方式更新所有匹配的行。

答案 1 :(得分:0)

我不太明白为什么你在SELECT语句中使用LIKE'°%'语句,同时限制。 接下来,你应该避免在循环中执行查询,因为这会严重损害性能。

SQL是基于集合设置的,因此完全可以在不使用循环的情况下执行此代码。

UPDATE [Table]
SET LastName = LTRIM(LastName)
WHERE LastName LIKE ' %'