SQL 绕圈算法???

来源:互联网 发布:js改变元素的display 编辑:程序博客网 时间:2024/04/29 13:35
SQL code--================================================--绕圈的SQL算法(感觉很笨,不知道有没有更好的算法)--作者:冷箫轻笛--日期:2008-02-21--执行方式(参数必须为整数的平方,但大小并不是无限制的)--exec raoquan 2500--================================================create proc raoquan(@num int)asbeginset nocount ondeclare @i intset @i = SQRT(@num)if CEILING(@i) <> @i returndeclare @table varchar(8000)declare @insert varchar(8000)declare @update varchar(8000)declare @print varchar(8000)select @insert = '',@update = '',@print = ''select @table = 'create table #t('declare @k intselect @k = 1while (@k <= @i)begin select @table = @table + '[' + cast(@k as varchar) + '] int,' select @insert = @insert + 'insert into #t([1]) select ' + cast(@k as varchar) + ' ' select @k = @k + 1endselect @table = reverse(stuff(reverse(@table),1,1,''))select @table = @table + ')'select @update = 'declare @r intdeclare @c intselect @r = SQRT(' + cast(@num as varchar) + '),@c = 1declare @i intselect @i = SQRT(' + cast(@num as varchar) + ') + 1declare @s1 char(1)select @s1 = ''+''declare @s2 char(1)select @s2 = ''c''declare @s3 int --用于计算符号select @s3 = 0declare @len intselect @len = SQRT(' + cast(@num as varchar) + ')declare @len2 intselect @len2 = 0while (@len > 0)begin if @s3 % 2 = 0 select @len = @len - 1 select @len2 = @len while(@len2 > 0) begin if @s1 = ''+'' begin if @s2 = ''c'' select @c = @c + 1 else select @r = @r + 1 end else begin if @s2 = ''c'' select @c = @c - 1 else select @r = @r - 1 end declare @sql varchar(8000) select @sql = ''update #t set ['' + cast(@c as varchar) + ''] = '' + cast(@i as varchar) + '' where [1] = '' + cast(@r as varchar) exec (@sql) select @len2 = @len2 - 1 select @i = @i + 1 end if @s3/2 % 2 = 1 select @s1 = ''+'' else select @s1 = ''-'' if @s2 = ''c'' select @s2 = ''r'' else select @s2 = ''c'' select @s3 = @s3 + 1end--select * from #t'select @print = 'declare @string varchar(8000)select @string = ''''declare @conn varchar(1000)select @conn =''''declare @ii intselect @ii = sqrt('+ cast(@num as varchar) + ')declare @m intselect @m = 1declare @n intselect @n = 1while (@ii >= @n)begin select @string = ''declare @conn varchar(1000) select @conn ='' select @m = 1 while (@ii >= @m) begin select @string = @string + '' right( SPACE(len(cast('+cast(@num as varchar)+' as varchar))) + cast(['' + cast(@m as varchar) + ''] as varchar), len(cast('+cast(@num as varchar)+' as varchar)) + 1) +'' select @m = @m + 1 end select @string = reverse(stuff(reverse(@string),1,1,'''')) select @string = @string + '' from #t where [1] = '' + cast(@n as varchar) + '' print @conn'' exec(@string) select @n = @n + 1end'exec (@table + @insert + @update + @print) end