2015-05-28 5 views
0

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

update TableName 
set 
    ColumnTwoName = REPLACE(LTRIM(RTRIM(ColumnOneName)),'(',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,')',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'+',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'*',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'&',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'@',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'|',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'/',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'!',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'.',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,',',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,':',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'£',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'?',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'''',''), 
    ColumnTwoName = REPLACE(ColumnTwoName,'-',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,']',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,'%',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,' ',' '), 
    ColumnTwoName = REPLACE(ColumnTwoName,' ',' '), 
    ColumnTwoName = REPLACE(LTRIM(RTRIM(ColumnTwoName)),' ','-'), 
    ColumnTwoName = REPLACE(ColumnTwoName,'--','-'), 
    ColumnTwoName = LOWER(ColumnTwoName) 
where ColumnTwoName is null or ColumnTwoName = '' 
+0

Это недопустимый синтаксис и не будет работать. Вы не можете обновлять один и тот же столбец более одного раза в одном заявлении об обновлении. Вместо этого вы должны вложить свои операторы замещения. –

ответ

0

Невозможно отформатировать эти много вложенных замен, чтобы они выглядели хорошо. Я оставил это довольно грубо, так что вы можете так, как это работает.

LOWER(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
LTRIM(RTRIM(ColumnOneName)) 
,'(',' ') 
,')',' ') 
,'+',' ') 
,'*',' ') 
,'&',' ') 
,'@',' ') 
,'|',' ') 
,'/',' ') 
,'!',' ') 
,'.',' ') 
,',',' ') 
,':',' ') 
,'£',' ') 
,'?',' ') 
,'''','') 
,'-',' ') 
,']',' ') 
,'%',' ') 
,' ',' ') 
,' ',' ') 
,' ','-') 
,'--','-') 
) 
+0

Привет, я пытаюсь понять это, но это довольно сложно, если он не отформатирован, можно ли отформатировать это? –

+0

Как я уже сказал, с помощью этого множества уровней очень сложно отформатировать это красиво. Это всего лишь LONG список вложенных замен. –

+0

я получил что-то вроде этого => \t обновления InstantWebPage \t набора ColumnOneName = LOWER (REPLACE (ЗАМЕНИТЬ (REPLACE (ЗАМЕНИТЬ (REPLACE (ЗАМЕНИТЬ (REPLACE (ЗАМЕНИТЬ (REPLACE (ЗАМЕНИТЬ (REPLACE (ЗАМЕНИТЬ (REPLACE (ЗАМЕНИТЬ (REPLACE (REPLACE (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (ЗАМЕНИТЬ (LTRIM (RTRIM (ColumnOneName)), '(', ''), ')', ''), '+', ''), '*', ' '),' & ',' '),' @ ',' '),' | ',' '),'/',' '),'! ',' '),'. ',' ') , ',', ''), ':', ''), '£', ''), '?', ''), '' '' ',' '),' - ',' '),' ']', ''), '%', ''), '', ''), '', ''), '', '-'), '-', '-')) \t где ColumnOneName имеет значение null или ColumnOneName = '' \t и ColumnThreeName = @ColumnThreeParam –

0

На делать замены символов, здесь StackOverflow вопрос, который имеет несколько вариантов сделать это в более общем плане:

How to Replace Multiple Characters in SQL?

Это кажется лучшая идея состоит в том, чтобы создать CLR с использованием регулярных выражений , Менее эффективным, но функциональным методом было бы создание скалярной функции. Выполнение всех вложенных замен inline работает достаточно хорошо ... но оно не выглядит красивым и не очень универсальным для повторного использования.

Если вы пытаетесь избавиться от всех дублированных пространств, выполняемые вами замены не будут работать, если имеется достаточно длинное количество пробелов. Если вы не используете CLR, вы можете использовать обновление в цикле while, чтобы рекурсивно избавиться от лишних пробелов. Что-то вроде:

select @@ROWCOUNT 
While @@ROWCOUNT > 0 
update TableName 
set ColumnTwoName = REPLACE(ColumnTwoName,' ', ' ') 
where ColumnTwoName like '% %' 

Я просто добавил Select @@ROWCOUNT заявление, в этом примере, чтобы убедиться, что @@Rowcount является 1, так что он будет ввести время цикла в первый раз, но вы можете сделать все, что необходимо для того, чтобы.

+0

Ознакомьтесь с этой статьей. Это основанный на наборе подход с использованием t-sql для замены нескольких пробелов одним. Гораздо лучше, чем цикл. : D http://www.sqlservercentral.com/articles/T-SQL/68378/ –

+0

Очень умный! Приятно, спасибо. Метод while while менее эффективен, но он не заменяет их по одному, поэтому, по крайней мере, он их экспоненциально удаляет O (N^2). С размером большинства строк он будет занимать всего несколько раз. Другой метод, связанный в этой статье, идеально подойдет скалярной функции для выполнения всех замен: http://www.sqlservercentral.com/Forums/Topic819042-203-15.aspx#bm821209 –

Смежные вопросы