0

SQL Server 2008でストアドプロシージャを作成しようとしていますが、テーブルのエントリの不要なスペースを削除する必要があります。テーブルのエントリを3つのタイプに分類しました。ストアドプロシージャは、次のように1文字の周りのスペースを削除する必要があります。

  • 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 に答える