0

nvarchar(max)タイプのテーブルセルがあり、通常は次のようになります。A03 B32 Y660 P02

たとえば、文字の後に数字が続き、スペースで区切られます。私がやりたいのは、SQLプロシージャでこれらすべての数値の合計を取得することです。他の言語ではかなり単純なことですが、私はSQLにかなり慣れていないだけでなく、文字列をいじるのはかなり不器用な言語のように思えます。とにかく、私はそれがこのようになると思います:

1)一時テーブルを作成し、分割関数を使用して入力します

2)すべてのセルの最初の文字を削除します

3)データをintに変換します

4)上記の一時テーブルの合計に設定されたターゲットtable.columnを更新します。

だから私はこれまでに到達しました:

CREATE PROCEDURE [dbo].[SumCell] @delimited nvarchar(max), @row int
AS
BEGIN
declare @t table(data nvarchar(max))

declare @xml xml 
set @xml = N'<root><r>' + replace(@delimited,' ','</r><r>') + '</r></root>' 

insert into @t(data) 
select  
    r.value('.','varchar(5)') as item 
from @xml.nodes('//root/r') as records(r) 

UPDATE TargetTable
SET TargetCell = SUM(@t.data) WHERE id = @row
END

明らかに、最初の文字の除去とint部分への変換が欠落しており、その上に、「スカラー変数@tを宣言する必要があります」というエラーが発生します...

4

2 に答える 2

1

質問はあまり明確ではないため、テキストがA3 B32 Y660 P20のような単一のセルにあると仮定すると、次のスニペットを使用して合計を取得できます。

DECLARE @Cell NVARCHAR(400), @Sum INT, @CharIndex INT

SELECT @Cell = 'A3 B32 Y660 P20',@Sum=0

WHILE (LEN(LTRIM(@Cell))>0)
BEGIN
    SELECT @CharIndex =  CHARINDEX(' ',@Cell,0)

    SELECT @Sum = @Sum + 
       SUBSTRING(@Cell,2,CASE WHEN @CharIndex>2 THEN @CharIndex-2 ELSE LEN(@Cell)-1 END )

    SELECT @Cell = SUBSTRING(@Cell,@CharIndex+1,LEN(@Cell))

    IF NOT (@CharIndex >0) BREAK;
END
--@Sum has the total of cell numbers
SELECT @Sum 
于 2012-09-17T16:29:50.290 に答える
0

テーブルを完全に選択するために、区切りリストで値の合計を見つけられるようにする必要があると想定しています。したがって、あなたの質問の最も複雑な部分は、値を分割することだと思います。私がよく使う方法は数値テーブルを必要とするので、それから始めましょう:

--If you really want to use a temporary numbers table don't use this method!
create table #numbers(
  Number int identity(1,1) primary key
)
declare @counter int
set @counter = 1
while @counter<=10000
 begin
    insert into #numbers default values
    set @counter = @counter + 1
 end

テストデータも作成します

create table #data(
  id int identity(1,1),
  cell nvarchar(max)
)
insert into #data(cell) values('A03 B32 Y660 P02')
insert into #data(cell) values('Y72 A12 P220 B42')

次に、分割機能をCTEに入れて、物事をクリーンに保ちます。

;with split as (
    select d.id,
        [valOrder] = row_number() over(partition by d.cell order by n.Number),
        [fullVal] = substring(d.cell, n.Number, charindex(' ',d.cell+' ',n.Number) - n.Number),
        [char] = substring(d.cell, n.Number, 1),
        [numStr] = substring(d.cell, n.Number+1, charindex(' ',d.cell+' ',n.Number) - n.Number)
    from #data d
        join #numbers n on substring(' '+d.cell, n.Number, 1) = ' '
    where n.Number <= len(d.cell)+1
)
select id, sum(cast(numStr as int))
from split
group by id
于 2012-09-17T22:20:58.060 に答える