SQL: обновление строки в цикле - PullRequest
1 голос
/ 15 октября 2011

Я пытаюсь удалить первый символ в LastNames, который начинается с пробела. Код ниже, кажется, полностью очищает LastName, делая поле пустым. Вы видите что-то не так?

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 ]

3 голосов
/ 15 октября 2011

Для меня код, который вы разместили, выполняется в бесконечном цикле.

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 ' %'

, чтобы обновить все подходящие строки на основе набора.

0 голосов
/ 15 октября 2011

Я не совсем понимаю, почему вы используете оператор LIKE '°%' в операторе SELECT при ограничении. Кроме того, вам следует избегать выполнения запросов внутри цикла, так как это сильно ухудшит производительность.

SQL установлен на основе, так что вполне возможно выполнить этот код без использования цикла.

UPDATE [Table]
SET LastName = LTRIM(LastName)
WHERE LastName LIKE ' %'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...