0

我有一个 nvarchar(max) 类型的表格单元格,通常如下所示: A03 B32 Y660 P02

例如,一个字母后跟一个数字,用空格分隔。我想要做的是在 SQL 过程中得到所有这些数字的总和。在其他语言中相当简单的东西,但我对 SQL 相当陌生,而且在我看来,它似乎是一种相当笨拙的语言来处理字符串。Aaanyway,我想它会是这样的:

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

显然,缺少第一个 char 剥离和转换为 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 回答