Create Procedure sp_MSJZ(@N int)
As
Begin
If @N<3 or @N%2=0
Begin
Print '请输入大于2的奇数'
Return
End
--定义I,J行列和值
Declare @I int=1,@J int,@K int,@X int,@Y int,@T int,@R int
--创建N列的表
Declare @str nVarchar(max)
Set @str='Create Table myTTTTTTT('
select @str=@str+'['+convert(Varchar(10),number)+'] int,' from master..spt_values where type='P'
and number>0 and number<1000 And number<=@N
Set @str=@str+'ID int)'
Exec(@str)
--添加N列数据
While @I<=@N
Begin
Insert Into myTTTTTTT(ID) Values(@I)
Set @I=@I+1
End
/*
开始填充
首先在最上面一行的中央填入1
然后一递增的顺序将后面的数字放入上面一行靠右一列的方格中
这种放置是可以环绕的,当下一个计算出来的位置的行数超出最上面一行的时候
就返回下一行,列数超出最右边就返回最左边,按此计算方法
如果计算出来的下一个位置已经被填充,就将下一个位置改为前一个位置的正下方
*/
Set @J=@N/2+1
Set @I=1
Set @K=1
Set @str='Update myTTTTTTT Set ['+Convert(Varchar(10),@J)+']='+Convert(Varchar(10),@K)+' Where ID='+Convert(Varchar(10),@I)
Exec(@str)
Set @T=2
While @T<=@N*@N
Begin
Set @X=@I
Set @Y=@J
Set @I=@I-1
Set @J=@J-1
IF @I<1
Set @I=@N
IF @J<1
Set @J=@N
Set @R=null
Set @str='Select @R=['+convert(Varchar(10),@J)+'] from myTTTTTTT Where ID='+Convert(Varchar(10),@I)
exec sp_executesql @str,N'@R int out',@R out
if (isnull(@R,0)<>0)
Begin
Set @I=@X+1
Set @J=@Y
End
Set @K=@K+1
Set @str='Update myTTTTTTT Set ['+Convert(Varchar(10),@J)+']='+Convert(Varchar(10),@K)+' Where ID='+Convert(Varchar(10),@I)
Exec (@str)
Set @T=@T+1
End
Alter Table myTTTTTTT Drop COLUMN ID
Select * From myTTTTTTT
Drop Table myTTTTTTT
End