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