用存儲過程和臨時表來寫,主要是想最后一個select出來結果,而且排成想要的三角形形狀。 由于BIGINT數據的限制,最多可以顯示67層。 結果 id ----------- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 1 1 2 1 1 3 1 2 1 4
用存儲過程和臨時表來寫,主要是想最后一個select出來結果,而且排成想要的三角形形狀。 由于BIGINT數據的限制,最多可以顯示67層。CREATE proc #pr_YangHui @c int as /* SQL實現顯示楊輝三角 */ /* 版本: 1.0 */ /* 作者: Haiwer */ /* 版權所有 */ /* 2006.05.10 */ set nocount on if @c<2 return --兩層以下就不排了 declare @i int declare @j int declare @sql varchar(8000) declare @sql1 varchar(8000) declare @sql2 varchar(8000) create table #(id int IDENTITY(1,1),a50000 bigint) insert #(a50000) values (1) --第一層 set @i=2 while @i<=@c begin --為了實現動態層,只好動態修改臨時表結構 set @sql='alter table # add a'+cast(50000+@i-1 as varchar(10))+' bigint,a'+cast(50000-@i+1 as varchar(10))+' bigint' exec (@sql) set @sql1='' set @sql2='' set @j=@i-1 while @j>=0 begin --這里判斷有點亂 if @j=0 set @sql1=@sql1+',a'+cast(50000-@j as varchar(10)) else set @sql1=@sql1+',a'+cast(50000-@j as varchar(10))+',a'+cast(50000+@j as varchar(10)) if @j=@i-1 set @sql2=@sql2+',1,1' else if @j=0 set @sql2=@sql2+',a'+cast(50000-@j-1 as varchar(10))+'+a'+cast(50000-@j+1 as varchar(10)) else set @sql2=@sql2+',a'+cast(50000-@j-1 as varchar(10))+'+a'+cast(50000-@j+1 as varchar(10))+',a'+cast(50000+@j-1 as varchar(10))+'+a'+cast(50000+@j+1 as varchar(10)) set @j=@j-2 end --去掉多余的逗號 set @sql1=right(@sql1,len(@sql1)-1) set @sql2=right(@sql2,len(@sql2)-1) set @sql=cast(@i-1 as varchar(10)) exec('insert #('+@sql1+') select '+@sql2+' from # where id='+@sql) set @i=@i+1 end set @i=50000-@c+1 set @j=50000+@c-1 set @sql='' --去最長的數據,就是為了節省顯示空間 select @sql1=CAST(len(cast(max(a50000) as varchar(50)))+1 AS VARCHAR(10)) from # while @i<=@j begin set @sql=@sql+',isnull(cast(a'+cast(@i as varchar(10))+' as varchar('+@sql1+')),'''')' set @i=@i+1 end exec ('select id'+@sql+' from # order by id') drop table # GO --調用 exec #pr_YangHui 8
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com