declare xcursor cursor for select * from style
declare @name varchar(100),@coll int,@colf int,@start varchar(20),@length varchar(20)
declare @sql varchar(8000)
set @sql='select '
open xcursor
fetch xcursor into @name,@coll,@colf
while @@fetch_status=0
begin
  select @start=cast(@coll as varchar(20))
  select @length=cast(@colf-@coll as varchar(20))
select @sql=@sql+'substring(note,'+@start+','+@length+') as '+@name+','
  fetch xcursor into @name,@coll,@colf
end
close xcursor
deallocate xcursor
select @sql=left(@sql,len(@sql)-1)+' from table1'
select @sql
exec(@sql)

解决方案 »

  1.   

    你可以剪切导查询分析器自己运行一下:create table style(colname varchar(100),coll int,colf int)
    insert into style values( 'WELL', 0, 11)
    insert into style values( 'T_ID', 12, 28)
    insert into style values( 'C_ID', 29, 40)
    go
    create table table1 (note varchar(8000))
    insert into table1 values('CF00-123    1285.0036        56703.265')
    insert into table1 values('abc-123     2285.043         11123.000')
    go
    declare xcursor cursor for select * from style
    declare @name varchar(100),@coll int,@colf int,@start varchar(20),@length varchar(20)
    declare @sql varchar(8000)
    set @sql='select '
    open xcursor
    fetch xcursor into @name,@coll,@colf
    while @@fetch_status=0
    begin
      select @start=cast(@coll as varchar(20))
      select @length=cast(@colf-@coll as varchar(20))
    select @sql=@sql+'substring(note,'+@start+','+@length+') as '+@name+','
      fetch xcursor into @name,@coll,@colf
    end
    close xcursor
    deallocate xcursor
    select @sql=left(@sql,len(@sql)-1)+' from table1'
    exec(@sql)drop table style,table1
      

  2.   

    不好意思!回来晚了。yoki(小马哥):你的意思我明白了一点,需要使用游标,但是好象一个游标不够用,如你的存储过程最后执行的语句是:
    select substring('CF00-123    1285.0036        56703.265',29,11) as name from table1我是想要把table1中所有的数据分开然后:
    insert into HT001(WELL,T_ID,C_ID) 
    values ('CF00-123',1285.0036,56703.265)你这个好象只取出来了一行中name一列的值。谢谢!帮我看一下。
      

  3.   

    不好意思!我明白了,我再试一下。谢谢yoki(小马哥)!
      

  4.   

    你运行一下就会知道了,当然是将table1表中的全部取出来
    比如我上面的例子table2中不是有两条记录吗?
    不过要更正一点:
    select @length=cast(@colf-@coll as varchar(20))改成
    select @length=cast(@colf-@coll as varchar(20))+1
      

  5.   

    谢谢!我已经调成功了,刚刚把@colf和@coll 搞相反了,得出负数。
    yoki(小马哥)你真是一个乐于助人的天才!