mssql 游標動態日期列

2021-08-13 03:36:56 字數 2779 閱讀 5935

需求:

已知表#temp2:

材料名稱   日期               數量

a1          2014-09-01    100

a1          2014-09-02    200

a2          2014-09-01     100

a2          2014-09-02     300

a3          2014-09-01   400

a3          2014-09-02   500

輸入:開始日期(2014-09-01)  結束日期(2014-09-25)

結果顯示如下:

材料名稱,2014-09-01,2014-09-02,2014-09-03,2014-09-04,........................2014-09-25

a1        ,  100      ,          200  ,           600 ,           700            .......................900    

a2        ,  200      ,          400  ,           600 ,           700            .......................900    

a3        ,  400      ,          200  ,           600 ,           700            .......................900    

注:以上資料不準確,只是舉例說明

第一步動態建立表:

--判斷表是否存在,存在則刪除

if exists(select *

from sys.objects

where object_id = object_id(n'ds_icmoplant')

and type in ( n'u' ) )

begin

drop table ds_icmoplant

end--定義

declare 

@fstr nvarchar(1000),--組合字串

@sql nvarchar(1000),--結果

@fsdates date,--開始日期

@fedates date  --結束日期

--賦值

set @fsdates=@fsdate 

set @fedates=@fedate

--迴圈得出組合字串

while @fsdates<=@fedates

begin

set @fstr= isnull(@fstr,'')+'''       '''+'  as '''+convert(varchar(100),@fsdates, 23)+''''+','

set @fsdates=dateadd(day, 1, @fsdates)

end--去掉最後乙個符號

set @fstr=substring(@fstr,1,len(@fstr)-1)

set @sql='select distinct 材料名稱,'+@fstr+' into ds_icmoplant from #temp2'

execute(@sql)

--結果如下

--select * from ds_icmoplan

第二步動態對列賦值:

--定義

declare 

@ssql nvarchar(1000),--結果

@fsdatee date, --開始日期

@fedatee date, --結束日期

@fdate varchar(100), --賦值用

@fvalue varchar(100), --數量

@fclnumber varchar(255)  --游標標量

declare x001 cursor for

select 材料名稱 from ds_icmoplan

open x001 

fetch next from x001 into @fclnumber 

while @@fetch_status = 0

begin

/* cursor logic */

set @fvalue=''

set @fsdatee=@fstarttime

set @fedatee=@fendtime

set @ssql=''

--迴圈查詢賦值

while @fsdatee<=@fedatee

begin

select @fvalue=數量 from  #temp2 where fdatetime=@fsdatee and 材料名稱=@fclnumber

set @fdate='['+convert(varchar(100),@fsdatee, 23)+']'

set @ssql='update ds_icmoplan set '+@fdate+'='+''''+@fvalue+''''+' where 材料名稱='+''''+@fclnumber+''''

execute(@ssql)

set @fvalue=''

set @fsdatee=dateadd(day, 1, @fsdatee)

endfetch next from x001 into @fclnumber

endclose x001

deallocate x001

--結果如下

select * from ds_icmoplan

MSSQL 游標的使用

與windows或dos的 游標 不同,ms sql的游標是一種臨時的資料庫物件,既對可用來旋轉儲存在系統永久表中的資料行的副本,也可以指向儲存在系統永久表中的資料行的指標。游標為您提供了在逐行的基礎上而不是一次處理整個結果集為基礎的操作表中資料的方法。1 如何使用游標 1 定義游標語句 decla...

MSSQL 游標使用例項

declare mycursor cursor forselect iglidenum,saccflag,a.sdeptno,saccman,ent mobil,daccdate,dsfinishdate from eg shl accept asa,eg sys entry ase where s...

mssql游標的簡單應用

游標修改資料 declare alarm cursor cursor global scroll for select lsc id,station id,alarm time,clear time,start time,end time from tmptelemetertwoday open a...