在Sql中处理表中字符串列中的数字问题

如有表数据,部分记录(其中列'banid'为主关键字)如下:

     banid      stylenocolor

2**15-*2-046  特白:11件;中灰:8件;彩蓝:8件;鲜黄:8件;鲜橙:8件;

  ...        ...

需要取出列'stylenocolor'中的数据,并求和。目前我采取的方法如下:

--创建记录板单颜色件数信息表
IF EXISTS(SELECT 1 FROM sysobjects WHERE id=OBJECT_ID('tb_getSum_banid') AND xtype='U')
DROP TABLE tb_getSum_banid
GO
CREATE TABLE tb_getSum_banid
(
    banid            VARCHAR(20) PRIMARY KEY NOT NULL,
    qty                INT DEFAULT 0
)
GO
--定义声明获取板单件数游标
DECLARE @banid VARCHAR(20),@qty INT,@stylenocolor VARCHAR(2000)
DECLARE cur_getSum_banid CURSOR
FOR
SELECT DISTINCT  banid,stylenocolor
  FROM b_itemsendfactory_head 
WHERE ISNULL(banid,'') <> ''
--打开游标
OPEN cur_getSum_banid
--使用游标
FETCH NEXT FROM cur_getSum_banid INTO @banid,@stylenocolor
WHILE @@FETCH_STATUS=0
BEGIN
    DECLARE @x INT

    SET @x=0
    SET @qty=0
    WHILE @x < LEN(@stylenocolor)+1
    BEGIN
        --取第一次查询到的数字
        SET @qty = @qty + SUBSTRING(@stylenocolor,
                                  patindex('%[^0-9][0-9]%',@stylenocolor)+1,
                                  patindex('%[0-9][^0-9]%',@stylenocolor)-patindex('%[^0-9][0-9]%', @stylenocolor))
        --取第一次出现数字后的字符
        SET @stylenocolor = SUBSTRING(@stylenocolor,
                                      patindex('%[0-9][^0-9]%',@stylenocolor)+1,
                                      LEN(@stylenocolor)-patindex('%[0-9][^0-9]%',@stylenocolor)+1)
        SET @x = @x + 1
    END
    --逐行插入表数据
    INSERT INTO tb_getSum_banid
    VALUES(@banid,@qty)
    
    FETCH NEXT FROM cur_getSum_banid INTO @banid,@stylenocolor
END
--关闭游标
CLOSE cur_getSum_banid
--释放游标
DEALLOCATE cur_getSum_banid

GO

 

posted @ 2018-05-18 15:39  tiger_yj  阅读(215)  评论(0编辑  收藏  举报