Удалить завершающий символ ":" из строки в таблице SQL - PullRequest
0 голосов
/ 20 января 2011

У меня есть таблица с миллионами строк.Для каждой строки есть столбец nvarchar (max).Когда я заполнил базу данных, я забыл удалить завершающий символ ":".Какой самый быстрый / самый эффективный способ пройти через каждую строку и удалить последний символ?

Я думаю, что должен быть самый быстрый способ сделать это, чем использовать REPLACE, который кажется дорогим.

Это SQL Server 2008

Ответы [ 4 ]

12 голосов
/ 20 января 2011

Вы можете использовать функцию STUFF , которая заменяет части строки.В данном случае это последний символ.

UPDATE tbl
SET COL = stuff(COL, len(COL), 1, '')
WHERE COL > ''

Или используйте ВЛЕВО, взяв все, кроме последнего.Условие COL> '' гарантирует, что LEFT будет иметь правильную длину.LEFT - это ярлык в SQL Server, который, по-видимому, реализован как SUBSTRING ( см. Далее ниже) *

UPDATE tbl
SET COL = LEFT(COL, len(COL) -1)
WHERE COL > ''

Если у вас есть данные как с конечной точкой с запятой, так и без нее, вы можете выбратьих конкретно

UPDATE tbl
SET COL = LEFT(COL, len(COL) -1)
WHERE RIGHT(COL,1) = ':'

Вот план запроса для запроса, использующего ВЛЕВО (показаны только 3 верхние строки текстового плана)

select LEFT(text, LEN(text)-1), * from master..syscomments
  |--Compute Scalar(DEFINE:([Expr1061]=substring([Union1060],(1),len([Union1060])-(1))))
       |--Concatenation
            |--Compute Scalar(DEFINE:([Expr1005]=(0), [Expr1007]=(0)))
2 голосов
/ 20 января 2011

Технически , есть способ без использования замены, если вы можете гарантировать, что последний символ - это тот, который должен быть удален:

Update Table
Set FatField = Substring(FatField, 1, DataLength(FatField)/2 - 1)

Однако, как предложил Митч Уит,если у вас столько строк, вам нужно разбить их на партии.

1 голос
/ 20 января 2011

Используйте SUBSTRING или STUFF, как предложено @Thomas, но дисковый ввод-вывод почти наверняка перевесит любые небольшие улучшения в памяти с таким количеством строк.

Я бы предложил выступать, скажем, по 100 000 строк за раз. Это уменьшит общий размер транзакции.

Вы также можете временно перевести БД в ПРОСТОЙ режим восстановления, который должен быть быстрее, но поговорите с вашим БД, так как это имеет значение ...

0 голосов
/ 23 мая 2016

Для оптимизации ресурсов наиболее эффективным будет следующее:

UPDATE MyTable
SET FatField = Reverse(SubString(Reverse(FatField),2,8000))
WHERE Right(FatField,1) = ':'

Должен любить "реверс". Он редко используется, но очень мощный и предоставляет решение для сложных задач.

...