表结构:t1  name 名称 varchar(50)   gg规格 varchar(20)           zl decimal(9,2)重量    
    
      钢板      1000 * 500 * 0.8  //就是长度*宽度*厚度         ------------------------------------------------------------------------------------
怎样才能得到zl这个计算列的值,因为gg列的数据类型是字符型,而且用户在录入的时候可能会不区分空格,就是说有这么几种状况:
1.1000*500*0.8
2.  1000 * 500 * 0.8
3.  1000*500 * 0.8
4.  1000 * 500*0.8
等等...
要求做到的是不管用户怎样录入,都可以得到正确的重量值.

解决方案 »

  1.   


    declare @str varchar(20)
    set @str = '1000 * 500 * 0.8'
    select cast(left(@str,charindex('*',@str)-1) as dec(9,2))
    * cast(substring(@str,charindex('*',@str)+1,charindex('*',@str,charindex('*',@str)+1) - charindex('*',@str) -1)  as dec(9,2))
    * cast(right(@str,charindex('*',REVERSE(@str))-1) as dec(9,2))结果:
    ---------------------
    400000.000000
    ---------------------
      

  2.   

    create table t1 ([name] varchar(08),gg varchar(20),zl dec(9,2))
    insert into t1([name],gg)
    select 'gangban1','1000* 500 *0.8'
    union
    select 'gangban2',' 1000 * 500  *0.8  '
    union 
    select 'gangban3',' 1000*500*0.8'
    union 
    select 'xxxxx','200*100*0.1  '
    select [name],gg,
    cast(Ltrim(Rtrim(left(gg,charindex('*',gg)-1))) as dec(9,2))
    *cast( Ltrim(Rtrim(left(stuff(gg,1,charindex('*',gg),''),charindex('*',stuff(gg,1,charindex('*',gg),''))-1))) as dec(9,2))
    *cast(Ltrim(Rtrim(right(gg,charindex('*',reverse(gg))-1))) as dec(9,2)) as zl
    from t1drop table t1/*The result:*/
    name     gg                   zl                              
    -------- -------------------- ------------------------------- 
    gangban1 1000* 500 *0.8       400000.000000
    gangban2  1000 * 500  *0.8    400000.000000
    gangban3  1000*500*0.8        400000.000000
    xxxxx    200*100*0.1          2000.000000
      

  3.   

    create table test( name  varchar(50),gg varchar(20),zl decimal(9,2) )
    insert into test(name,gg)
    select '钢板1','1000*500*0.8' union all
    select '钢板2','1000 * 500 * 0.8' union all
    select '钢板3','1000 * 500 * 0.8' union all
    select '钢板4','1000 * 500*0.8'
    godeclare @gg varchar(50),@num decimal(9,2)
    declare @sql nvarchar(4000)
    declare cur cursor for 
    select gg from test for update of zl
    open cur
    fetch next from cur into @gg
    while @@fetch_status=0
    begin
    set @sql='select @num='+@gg
    exec sp_executesql @sql,N'@num decimal(9,2) out',@num outupdate test set zl=@num where current of cur
    fetch next from cur into @gg
    end
    deallocate curselect * from test
    go
    drop table test