tablename                                          fieldname                                          isdatetime datetimelength
-------------------------------------------------- -------------------------------------------------- ---------- --------------
Ids_ActualData                                     sw1                                                0          NULL
Ids_ActualData                                     sw2                                                0          NULL
Ids_ActualData                                     ymdhm                                              1          16
Ids_Configuration                                  zdID                                               0          NULL
Ids_Configuration                                  zdmc                                               0          NULL
Ids_ActualData                                     yl                                                 0          NULL
我这里有张这样的表,我想把表内的字段通过sql转换成
Ids_Configuration.zdID zdid,Ids_Configuration.zdmc zdmc,convert(varchar(16),Ids_ActualData.ymdhm,120) ymdhm,Ids_ActualData.sw1 sw1,Ids_ActualData.sw2 sw2
其中convert(varchar(16),Ids_ActualData.ymdhm,120)是通过isdatetime来判断的,这里面的16就是datetimelength里存储的,请高手帮忙啊,谢谢

解决方案 »

  1.   

    我是想把上面的结果集转换成一个sql 的一部分,这个select是通过表中的内容拼的,也就是 tablename.fieldname fieldname 这样,如果碰到isdatetime,则转换convert(varchar(16),tablename.fieldname,120) fieldname 这样,其中varchar里面的16是在datetimelength里存储的,
      

  2.   

    使用油标完成的.create table tb(tablename varchar(20), fieldname varchar(20), isdatetime int,datetimelength int)
    insert into tb values('Ids_ActualData ' , 'sw1' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'sw2' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'ymdhm', 1 , 16)
    insert into tb values('Ids_Configuration' , 'zdID' , 0 , NULL)
    insert into tb values('Ids_Configuration' , 'zdmc' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'yl' , 0 , NULL)
    godeclare @tablename varchar(20), @fieldname varchar(20), @isdatetime int,@datetimelength int;
    declare @sql as varchar(8000)
    set @sql = ''
    declare cur cursor fast_forward for
      select * from tb;
    open cur;
    fetch next from cur into @tablename , @fieldname , @isdatetime ,@datetimelength;
    while @@fetch_status=0
    begin
       if @isdatetime = 1
          set @sql = @sql + 'convert(varchar(' + cast(@datetimelength as varchar) + '),' + @tablename + '.' + @fieldname + ',120) ' + @fieldname + ',' 
       else
          set @sql = @sql + @tablename + '.' + @fieldname + ' ' + @fieldname + ',' 
       fetch next from cur into @tablename , @fieldname , @isdatetime ,@datetimelength;
    end
    close cur;
    deallocate cur;set @sql = left(@sql , len(@sql) - 1)
    print @sql drop table tb/*
    Ids_ActualData .sw1 sw1,Ids_ActualData .sw2 sw2,convert(varchar(16),Ids_ActualData .ymdhm,120) ymdhm,Ids_Configuration.zdID zdID,Ids_Configuration.zdmc zdmc,Ids_ActualData .yl yl
    */
      

  3.   

    --这是用动态SQL语句完成的.
    create table tb(tablename varchar(20), fieldname varchar(20), isdatetime int,datetimelength int)
    insert into tb values('Ids_ActualData ' , 'sw1' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'sw2' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'ymdhm', 1 , 16)
    insert into tb values('Ids_Configuration' , 'zdID' , 0 , NULL)
    insert into tb values('Ids_Configuration' , 'zdmc' , 0 , NULL)
    insert into tb values('Ids_ActualData ' , 'yl' , 0 , NULL)
    godeclare @sql varchar(8000)
    set @sql = ''
    select @sql = @sql + t.tablename + '.' + t.fieldname + ' ' + t.fieldname +  ',' from (select * from tb where isdatetime = 0) as t
    select @sql = @sql + 'convert(varchar(' + cast(t.datetimelength as varchar) + '),' + tablename + '.' + fieldname + ',120) ' + fieldname + ',' from (select * from tb where isdatetime = 1) as t
    set @sql=left(@sql , len(@sql) - 1)
    print @sql drop table tb/*
    Ids_ActualData .sw1 sw1,Ids_ActualData .sw2 sw2,Ids_Configuration.zdID zdID,Ids_Configuration.zdmc zdmc,Ids_ActualData .yl yl,convert(varchar(16),Ids_ActualData .ymdhm,120) ymdhm
    */