0

我正在尝试在 sql server 2008 中编写存储过程,我需要删除表条目中不需要的空格。我将表中的条目分为 3 种类型。我的存储过程应该删除单个字母周围的空格,例如,

  • A G M wordsAGM words
  • words A G M wordswords AGM words
  • A G wordsAG 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=(@temp+@temp1)
        end
        else
        begin
            set @temp=(@temp+' '+@temp1)
        end
    end
    else
    begin
        set @temp=@temp1
    end
    set @start=@NthPosition+1
    set @N=@N-@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' 

我的预期结果:apple AGM mango

但我的实际结果:apple

我无法弄清楚错误出在哪里。这方面的任何建议都会更有帮助。我尝试使用可以清除空间的计算列,我只能找到模式#3 的解决方案。我无法构建适合所有 3 种模式的计算列定义.....请分享您的想法对我有帮助

4

2 回答 2

0

可能有更简单的方法,使用替换而不是遍历所有内容并使用该substring方法。

但话又说回来,您也可能会查看您的输入。这个“处理器”怎么知道一个词是什么?事实上,单词 applea (apple a) 可能不是您要查找的单词,该处理器可能会将其视为单词(理论上)

您可以做的最好的事情是分隔您的输入,例如使用分号“;”。然后,您可以使用拆分功能将这些值放入表中(例如查看这篇文章:T-SQL:拆分和聚合逗号分隔值)。接下来就可以使用上面的replace功能了。

你得到这样的东西

select replace(s.value, ' ' , ''), * from split(@value) as s

于 2013-01-29T07:28:48.527 回答
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

(作为一个简化的假设,我假设我可以从原始字符串中删除任何前导空格。我还假设字符串中没有双空格。如果这些假设都不准确,则需要做更多的工作)

于 2013-01-29T07:36:59.100 回答