Удаление пространства sql server 2008

Я пытаюсь написать хранимую процедуру в SQL Server 2008, мне нужно удалить ненужные пробелы в записях моей таблицы. Я классифицировал записи в таблице в 3 типа. Моя процедура магазина должна удалять пробелы вокруг одной буквы, например,

  • A G M words to AGM words
  • words A G M words to words AGM words
  • A G words to AG words

Я попытался выполнить хранимую процедуру.

CREATE proc At1 @name nvarchar(100)
as
declare @start int
declare @temp1 nvarchar(100)
declare @temp nvarchar(100)
declare @NthPosition int
declare @N int
set @N=LEN(@name)
set @start=1
set @temp1=''
set @temp=''


    set @NthPosition=charindex(' ',@name,@start)
    if(@NthPosition<>0)
    begin
    while (@NthPosition<>0 and @N<>0)
    begin
    set @temp1=SUBSTRING(@name,@start,@NthPosition-1)
    if(@temp<>'')
    begin
        if(len(@temp1)=1)
        begin
            set @temp=(@[email protected])
        end
        else
        begin
            set @temp=(@temp+' '[email protected])
        end
    end
    else
    begin
        set @[email protected]
    end
    set @[email protected]+1
    set @[email protected]@NthPosition
    set @NthPosition=0
    set @NthPosition=CHARINDEX(' ',@name,@start)
    end
    end
    else
    begin 
            select @name
    end
          select @temp
        GO

и я использовал,

    exec At1 'apple A G M mango' 

My expected result: apple AGM mango

But my actual result:apple

Я не могу понять, где ошибка. Любые предложения в этом отношении более полезны. Я попытался использовать вычисляемый столбец, который очистил бы пространство, и я смог найти решение только для шаблона # 3. Мне не удалось создать расчетное определение столбцов, подходящее для всех трех шаблонов ..... Пожалуйста, поделитесь своими мыслями, которые будут быть полезным для меня

0
nl ja de
Я добавил ваши примеры, чтобы попытаться отделить текст примера от текста объяснения - я надеюсь, что все правильно. Без какого-либо форматирования было немного сложно понять.
добавлено автор Damien_The_Unbeliever, источник

2 ответы

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

Но опять же, вы также можете посмотреть на свой вклад. Как этот «процессор» знает, что такое слово? На самом деле слово applea (apple a) может не быть словом, которое вы ищете, где этот процессор потенциально будет рассматривать его как слово (теоретическое)

Лучшее, что вы можете сделать, это отделить ваш вход, например, точкой с запятой «;». Затем вы можете использовать split functionallity, чтобы сделать эти значения в таблице (например, посмотрите на этот пост: T-SQL: разделенные и агрегированные значения, разделенные запятыми ). Затем вы можете использовать функцию replace .

Вы получаете что-то вроде этого

выберите replace (s.value, '', ''), * из split (@value) как s

0
добавлено

Я думаю, что это касается всех случаев:

CREATE proc At1 @Name nvarchar(100)
as
declare @New nvarchar(100)
declare @SpacePos int
declare @Single bit
select @New = '',@Single = 0
select @Name = LTRIM(@Name)

while LEN(@name) > 0
begin
    set @SpacePos = CHARINDEX(' ',@Name)
    if @SpacePos = 0 --No more spaces in the string
    begin
        select @New = @New + CASE WHEN @Single = 1 and LEN(@Name) > 1 THEN ' ' ELSE '' END + @Name,
        @Name = ''
    end
    else if @SpacePos = 2 --Single character "word"
    begin
        select @New = @New + SUBSTRING(@Name,1,1),
            @Name = SUBSTRING(@Name,3,100),
            @Single = 1
    end
    else --Multi-character word
    begin
        select @New = @New + CASE WHEN @Single = 1 THEN ' ' ELSE '' END + SUBSTRING(@Name,1,@SpacePos),
            @Name = SUBSTRING(@Name,@SpacePos+1,100),
            @Single = 0
    end
end
select @New
go

И примеры:

exec At1 'apple A G M mango' 
exec At1 'A G M words'
exec At1 'words A G M'

Производит:

apple AGM mango
AGM words
words AGM

(В качестве упрощающего предположения я предположил, что я мог удалить все ведущие пробелы из исходной строки. Я также предполагаю, что в строке нет двойных пробелов. Если ни одно из этих предположений не является точным, требуется немного больше работы)

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)