好吧我们知道BIGINT的最大值是2^63-1,也就是9,223,372,036,854,775,807,那么2^64是多少呢?再往上呢?穷极无聊的我写了个计算2的N次方的语句,不过超过100后好像速度就慢下来了,用这个语句计算10000次方花了10分钟才出来数。放出300技术分,看看谁写的SQL语句能最快的算出2的10000次方。如果能写出瞬间计算出来的语句,立刻结帖
取巧的不算,比如把我帖的结果直接SELECT出来的
本活动最终解释权归本鸭所有
取巧的不算,比如把我帖的结果直接SELECT出来的
本活动最终解释权归本鸭所有
SET NOCOUNT ON
GO
USE TEMPDB
GO
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(ID INT PRIMARY KEY,VAL BIGINT)
;WITH MU AS (
SELECT 1 AS ID,1 AS VAL
UNION ALL
SELECT ID+1,0 FROM MU WHERE ID<10000 --10000行预留,大致估计10000次方只需要1000行左右。
)
INSERT INTO TB
SELECT * FROM MU OPTION(MAXRECURSION 0)
DECLARE @I INT ,@COUNT INT,@RESULT VARCHAR(MAX)
SELECT @I=1,@RESULT='',@COUNT=10000 --@COUNT=10000就是计算2的10000次方
WHILE @I<=@COUNT
BEGIN
UPDATE T1 SET T1.VAL=(T1.VAL*2+CASE WHEN T2.VAL>=500000000000000000 THEN 1 ELSE 0 END)%1000000000000000000
FROM TB T1
LEFT JOIN TB T2 ON T1.ID=T2.ID+1
SET @I=@I+1
END
SELECT @RESULT=@RESULT+CONVERT(VARCHAR(20),VAL) FROM TB
WHERE VAL>0
ORDER BY ID DESC
SELECT @RESULT
SET NOCOUNT OFF
就是 三张表:
学生表
create table Student
(
Id varchar(64) primary key not null
constraint dfid default (newid()),
Number varchar(12) unique not null, 学号
Name varchar(12) not null 名字
)
课程表
create table Course
(
Id varchar(64) primary key not null constraint cdfid default(newid()),
CouNumer varchar(12) not null, 课程号
Name varchar(24) not null, 科目
)
学生成绩表
create table Grade
(
Id varchar(64) primary key not null default(newid()),
StuNum varchar(12), 学号
CouNum varchar(24), 科目
Grade int check ( Grade > 0 and Grade <= 100)
)问题是:我想学生成绩表关联 学生表的学号 和 课程表的 课程号
每张表的 Id都是newid() 这样岂不是 关联不起了吗?外键不是 必须要主键来关联吗?
该怎么弄啊.
自己翻翻去吧,现在看到学生表就哆嗦
set @i=power(cast(2 as bigint),50)
select @i
--2的50次方=1125899906842624
declare @k decimal(38,30)
set @k=1.125899906842624
select power(@k,100)
/*141246.703213943690000000000000000000*/
SELECT @RESULT=@RESULT+CONVERT(VARCHAR(20),VAL) FROM TB
应改成:
SELECT @RESULT=@RESULT+right('0000000000000000000'+CONVERT(VARCHAR(20),VAL),18) FROM TB否则,前导零被去除了.
SET NOCOUNT ON
GO
USE TEMPDB
GO
IF OBJECT_ID('BASED') IS NOT NULL DROP TABLE BASED
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE BASED(ID INT PRIMARY KEY,VAL BIGINT)
;WITH MU AS (
SELECT 1 AS ID
UNION ALL
SELECT ID+1 FROM MU WHERE ID<30
)
INSERT INTO BASED SELECT 0,1 union all
SELECT id,power(convert(bigint,2),id) FROM MU
--以上求出2^1~2^30
DECLARE @I INT ,@COUNT INT,@RESULT VARCHAR(MAX),@two30 bigint,@twoleft bigint
SELECT @I=1,@RESULT='',@COUNT=10000 --@COUNT=10000就是计算2的10000次方
select @two30=val from BASED where id=30
select @twoleft=val from BASED where id=@count % 30
--行数 @count/30+1,
print @two30
CREATE TABLE TB(ID INT PRIMARY KEY,VAL BIGINT)
;WITH MU AS (
SELECT 1 AS ID,1 AS VAL
UNION ALL
SELECT ID+1,0 FROM MU WHERE ID<@count/30+1 --总行数 @count/30+1
)
INSERT INTO TB
SELECT * FROM MU OPTION(MAXRECURSION 0)WHILE @I<=@COUNT/30
BEGIN
UPDATE T1 SET T1.VAL= (T1.VAL*@two30+CASE WHEN T2.VAL*@two30>1000000000 THEN T2.VAL*@two30/1000000000 ELSE 0 END)%1000000000
FROM TB T1
LEFT JOIN TB T2 ON T1.ID=T2.ID+1
SET @I=@I+1
END
UPDATE T1 SET T1.VAL= (T1.VAL*@twoleft+CASE WHEN T2.VAL*@twoleft>1000000000 THEN T2.VAL*@twoleft/1000000000 ELSE 0 END)%1000000000
FROM TB T1
LEFT JOIN TB T2 ON T1.ID=T2.ID+1
SELECT @RESULT=@RESULT+right('00000000'+CONVERT(VARCHAR(10),VAL),9) FROM TB
WHERE VAL>0 and id<=@count/30
ORDER BY ID DESC
SELECT @RESULT=CONVERT(VARCHAR(10),VAL)+@RESULT FROM TB
WHERE VAL>0 and id=@count/30+1SELECT @RESULT
SET NOCOUNT OFF
declare
@str nvarchar(max),
@strBack nvarchar(max),
@y smallint,
@strtemp char(1),
@f smallint,
@weishu smallint,
@neiLoop int,
@jinwei int;Set @y=1;
set @jinwei=0;
set @str='4';
set @neiLoop=1;
set @strBack='';while(@y<5000)--循环n次计算4的n次方
begin
set @jinwei=0;
set @neiLoop=1;
set @strBack='';
set @weishu=len(@str);--首先获取当前数字的字符串位数
while(@neiLoop<@weishu+1)--一次从右边遍历每一位
begin
set @strtemp=right(@str,1); --取最右边一位
set @f=cast(@strtemp as int)*4;--转换成数字乘以4
set @f=@f+@jinwei--和进位相加,得出当前位的值
if(@neiLoop=@weishu)--是最后一位
begin
set @strBack=cast(@f as nvarchar(max))+@strBack;
end
else
begin
if(@f>=10)
begin
set @strBack=right(cast(@f as nvarchar(max)),1)+@strBack;
set @jinwei=left(@f,1);
set @str=left(@str,@weishu-@neiLoop);
end
else
begin
set @strBack=cast(@f as nvarchar(max))+@strBack;
set @jinwei=0;
set @str=left(@str,@weishu-@neiLoop);
end
end
set @neiLoop=@neiLoop+1
end
set @str=@strBack;
set @y=@y+1;
end
print @strBack
go
运行时间:第一次3分59秒 第二次3分22秒
机器配置:主频1.66GHz T5450酷睿2双核。
求鸭子鉴定结果
declare
@str nvarchar(max),
@strBack nvarchar(max),
@y smallint,
@strtemp char(1),
@f smallint,
@weishu smallint,
@neiLoop int,
@jinwei int;Set @y=1;
set @jinwei=0;
set @str='4';
set @neiLoop=1;
set @strBack='';while(@y<5000)--循环n次计算4的n次方
begin
set @jinwei=0;
set @neiLoop=1;
set @strBack='';
set @weishu=len(@str);--首先获取当前数字的字符串位数
while(@neiLoop<@weishu+1)--一次从右边遍历每一位
begin
set @strtemp=right(@str,1); --取最右边一位
set @f=cast(@strtemp as int)*4;--转换成数字乘以4
set @f=@f+@jinwei--和进位相加,得出当前位的值
if(@neiLoop=@weishu)--是最后一位
begin
set @strBack=cast(@f as nvarchar(max))+@strBack;
end
else
begin
if(@f>=10)
begin
set @strBack=right(cast(@f as nvarchar(max)),1)+@strBack;
set @jinwei=left(@f,1);
set @str=left(@str,@weishu-@neiLoop);
end
else
begin
set @strBack=cast(@f as nvarchar(max))+@strBack;
set @jinwei=0;
set @str=left(@str,@weishu-@neiLoop);
end
end
set @neiLoop=@neiLoop+1
end
set @str=@strBack;
set @y=@y+1;
end
print @strBack
go
运行时间:第一次3分59秒 第二次3分22秒
机器配置:主频1.66GHz T5450酷睿2双核。
求鸭子鉴定结果
看到楼主题目后,我的第一反应就是采用#26的方法。可惜周末在家,没有SQL环境,让#26抢先了...
下列程序 2 秒内完成:
SET NOCOUNT ON
GO
USE TEMPDB
GO
IF OBJECT_ID('BASED') IS NOT NULL DROP TABLE BASED
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE BASED(ID INT PRIMARY KEY,VAL BIGINT)
INSERT INTO BASED SELECT 0,1 union all
SELECT id,power(convert(bigint,2),id) FROM(
select number as id from master..spt_values where type='p' and number>0 and number<31
)T
--以上求出2^1~2^30DECLARE @I INT ,@COUNT INT,@RESULT VARCHAR(MAX),@two30 bigint,@twoleft bigint
SELECT @I=1,@RESULT='',@COUNT=10000 --@COUNT=10000就是计算2的10000次方
select @two30=val from BASED where id=30
select @twoleft=val from BASED where id=@count % 30CREATE TABLE TB(ID INT PRIMARY KEY,VAL BIGINT)
INSERT INTO TB SELECT 1,1
INSERT INTO TB
SELECT number,0 FROM(
select number from master..spt_values where type='p' and number>1 and number<=@count/30+2
)T
--总行数 @count/30+1WHILE @I<=@COUNT/30
BEGIN
UPDATE T1 SET T1.VAL= (T1.VAL*@two30+(isnull(T2.VAL,0)*@two30+isnull(t3.val,0)*@two30/1000000000)/1000000000)%1000000000
FROM TB T1 LEFT JOIN TB T2 ON T1.ID=T2.ID+1 left join tb t3 on t2.id=t3.id+1
SET @I=@I+1
END
-- @count/30 次 @two30 相乘UPDATE T1 SET T1.VAL= (T1.VAL*@twoleft+(isnull(T2.VAL,0)*@twoleft+isnull(t3.val,0)*@twoleft/1000000000)/1000000000)%1000000000
FROM TB T1 LEFT JOIN TB T2 ON T1.ID=T2.ID+1 left join tb t3 on t2.id=t3.id+1
--乘以剩下的 2^(@count % 30)SELECT @RESULT=@RESULT+right('00000000'+CONVERT(VARCHAR(10),VAL),9) FROM TB
WHERE id<=@count/30
ORDER BY ID DESC
SELECT @RESULT=CONVERT(VARCHAR(10),VAL)+@RESULT FROM TB
WHERE VAL>0 and id=@count/30+2SELECT @RESULT
SET NOCOUNT OFF
/*
19950583848837421626835850838234
.....
*/
再次更正:
SET NOCOUNT ON
GO
USE TEMPDB
GO
IF OBJECT_ID('BASED') IS NOT NULL DROP TABLE BASED
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE BASED(ID INT PRIMARY KEY,VAL BIGINT)
INSERT INTO BASED SELECT 0,1 union all
SELECT id,power(convert(bigint,2),id) FROM(
select number as id from master..spt_values where type='p' and number>0 and number<31
)T
--以上求出2^1~2^30DECLARE @I INT ,@COUNT INT,@RESULT VARCHAR(MAX),@two30 bigint,@twoleft bigint
SELECT @I=1,@RESULT='',@COUNT=10000 --@COUNT=10000就是计算2的10000次方
select @two30=val from BASED where id=30
select @twoleft=val from BASED where id=@count % 30CREATE TABLE TB(ID INT PRIMARY KEY,VAL BIGINT)
INSERT INTO TB SELECT 1,1
INSERT INTO TB
SELECT number,0 FROM(
select number from master..spt_values where type='p' and number>1 and number<=@count/30+2
)T
--总行数 @count/30+1WHILE @I<=@COUNT/30
BEGIN
UPDATE T1 SET T1.VAL= (T1.VAL*@two30+(isnull(T2.VAL,0)*@two30+isnull(t3.val,0)*@two30/1000000000)/1000000000)%1000000000
FROM TB T1 LEFT JOIN TB T2 ON T1.ID=T2.ID+1 left join tb t3 on t2.id=t3.id+1
SET @I=@I+1
END
-- @count/30 次 @two30 相乘UPDATE T1 SET T1.VAL= (T1.VAL*@twoleft+(isnull(T2.VAL,0)*@twoleft+isnull(t3.val,0)*@twoleft/1000000000)/1000000000)%1000000000
FROM TB T1 LEFT JOIN TB T2 ON T1.ID=T2.ID+1 left join tb t3 on t2.id=t3.id+1
--乘以剩下的 2^(@count % 30)SELECT @RESULT=@RESULT+right('00000000'+CONVERT(VARCHAR(10),VAL),9) FROM TB
WHERE id<=@count/30+1
ORDER BY ID DESC
SELECT @RESULT=CONVERT(VARCHAR(10),VAL)+@RESULT FROM TB
WHERE VAL>0 and id=@count/30+2SELECT @RESULT
SET NOCOUNT OFF
/*
199506311688075838488374216268358508382349683188619245
.....
*/
SELECT ID,SUM(VAL) AS [求和],DBO.FUN_MU(VAL) AS [求积] FROM TB
因为不知道有多少行,出来的很有可能是天文数字,那这个函数内肯定要有类似于26L那样的手工进位运算,这时候就无法取巧,只能硬算了。
SET NOCOUNT ON
GO
USE TEMPDB
GO
IF OBJECT_ID('BASED') IS NOT NULL DROP TABLE BASED
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE BASED(ID INT PRIMARY KEY,VAL BIGINT)
INSERT INTO BASED SELECT 0,1 union all
SELECT id,power(convert(decimal(38,0),2),id) FROM(
select number as id from master..spt_values where type='p' and number>0 and number<57
)T
insert into BASED select number+57,power(convert(decimal(38,0),2),56)*power(2,number+1) from master..spt_values where type='p' and number<4
--以上求出2^1~2^60,因power函数在2^56以上时有舍去位,故分两步处理,以乘法代之
DECLARE @I INT ,@COUNT INT,@RESULT VARCHAR(MAX),@P60 decimal(38,0),@Pleft decimal(38,0)
SELECT @I=1,@RESULT='',@COUNT=10000 --@COUNT=10000就是计算2的10000次方
select @P60=val from BASED where id=60
select @Pleft=val from BASED where id=@count % 60CREATE TABLE TB(ID INT PRIMARY KEY,VAL decimal(38,0))
INSERT INTO TB SELECT 1,1
INSERT INTO TB
SELECT number,0 FROM(
select number from master..spt_values where type='p' and number>1 and number<=@count/60+2
)T
--设总行数为 @count/60+2WHILE @I<=@COUNT/60
BEGIN
UPDATE T1 SET T1.VAL= (T1.VAL*@P60+floor((isnull(T2.VAL,0)*@P60+floor(isnull(t3.val,0)*@P60/10000000000000000000))/10000000000000000000))%10000000000000000000
FROM TB T1 LEFT JOIN TB T2 ON T1.ID=T2.ID+1 left join tb t3 on t2.id=t3.id+1
SET @I=@I+1
END
-- @count/60 次 @P60 相乘UPDATE T1 SET T1.VAL= (T1.VAL*@Pleft+floor((isnull(T2.VAL,0)*@Pleft+floor(isnull(t3.val,0)*@Pleft/10000000000000000000))/10000000000000000000))%10000000000000000000
FROM TB T1 LEFT JOIN TB T2 ON T1.ID=T2.ID+1 left join tb t3 on t2.id=t3.id+1
--乘以剩下的 2^(@count % 60)SELECT @RESULT=@RESULT+right('000000000000'+CONVERT(VARCHAR(19),VAL),19) FROM TB
WHERE VAL>0
ORDER BY ID DESC
--SELECT @RESULT=CONVERT(VARCHAR(10),VAL)+@RESULT FROM TB
--WHERE and id=@count/30+2SELECT right(@RESULT,LEN(@RESULT)-PATINDEX('%[1-9]%',@RESULT)+1)
SET NOCOUNT OFF
/*199506311688075838488374216268358508382349683188619245
.....
*/
declare @count int
set @count=10000
SET NOCOUNT ON
declare @sql varchar(8000),@p60 decimal(38,0)
--创建基表,获取2^0~2^60的值
CREATE TABLE BASED(ID INT PRIMARY KEY,VAL decimal(38,0))
INSERT INTO BASED SELECT 0,1 union all
SELECT id,power(convert(decimal(38,0),2),id) FROM(
select number as id from master..spt_values where type='p' and number>0 and number<57
)T
insert into BASED select number+57,power(convert(decimal(38,0),2),56)*power(2,number+1) from master..spt_values where type='p' and number<4
--以上求出2^1~2^60,因power函数在2^56以上时有舍去位,故分两步处理,以乘法代之
select @p60=val from based where id=60
--创建表
set @sql='create table tb(n1 decimal(38,0)'
select @sql=@sql+',n'+convert(varchar,number+2)+' decimal(38,0) default 0' from master..spt_values where type='p' and number<=@count/60
set @sql=@sql+')'
exec(@sql)
--第一列赋初值
if @count/60>0
insert into tb(n1) values(@p60)
else
insert into tb(n1) select val from based where id=@count % 60
--计算
declare @i int,@R decimal(20,0),@flg decimal(20,0),@P decimal(20,0),@sql1 nvarchar(max)
set @i=1
set @R=convert(decimal(20,0),'10000000000000000000')
set @P=@P60
while @count>=120
begin
set @sql1='update tb set n1=n1*@P%@R,n2=(floor(n1*@P/@R)+n2*@P)%@R'
select @sql1=@sql1+',n'+convert(varchar,number+3)+'=(floor((floor(n'+convert(varchar,number+1)+'*@P/@R)+'
+'n'+convert(varchar,number+2)+'*@P)/@R)+n'+convert(varchar,number+3)+'*@P)%@R'
from master..spt_values where type='p' and number<@i --and number<64
set @sql1=@sql1+',@flg=(floor((floor(n'+convert(varchar,@i)+'*@P/@R)+n'+convert(varchar,@i+1)+'*@P)/@R)+n'+convert(varchar,@i+2)+'*@P)%@R'
exec SP_EXECUTESQL @sql1,N'@P decimal(20,0),@R decimal(20,0),@flg decimal(20,0) output',@P,@R,@flg output
if @flg>0 select @i=@i+1
set @count=@count-60
end
--此处要加上与@Pleft有关的运算,也得用动态语句select * from tb
--连接未写
go
drop table based,tb
SET NOCOUNT OFF
--先建一个辅助表
create table num(id int primary key, v bigint)
--插入一些记录
declare @i int
set @i = 1
while @i <= 300
begin
insert num values(@i, 0)
set @i = @i + 1
end--下面开始计算
declare @i int
set @i = 1
update num set v = 2 where id = 1
while @i < 10000
begin
update a set a.v = a.v*2%100000000000000000+isnull(b.v,0)*2/100000000000000000 from num a left join num b on a.id = b.id + 1 where a.id <= @i/45 + 1
set @i = @i + 1
enddeclare @id int
select @id = max(id) from num where v > 0
select case id when @id then '' else replicate('0',17-len(v)) end+ltrim(v) from num where id <= @id order by id desc/*
--------------------------
19
95063116880758384
88374216268358508
38234968318861924
54852008949852943
88302219466319199
...
74304792596709376(178 行受影响)
*/本机计算15秒
# 1秒内完成结果开始:
19950631168807583848837421626835850838234968318861
92454852008949852943883022194663191996168403619459
78993311294232091242715564913494137811175937859320
96323957855730046793794526765246551266059895520550
08691819331154250860846061810468550907486608962488
80904898948380092539416332578506215683094739025569
12388065225096643874441046759871626985453222868538
16169431577562964076283688076073222853509164147618
39563814589694638994108409605362678210646214273333
94036525565649530603142680234969400335934316651459
29777327966577560617258203140799419817960737824568
37622800373028854872519008344645814546505579296014
14833921615734588139257095379769119277800826957735
67444412306201875783632550272832378927071037380286
63930314281332414016241956716905740614196543423246
38801248856147305207431992259611796250130992860241
70834080760593232016126849228849625584131284406153
67389514871142563151110897455142033138202029316409
57596464756010405845841566072044962867016515061920
63100418642227590867090057460641785695191145605506
82512504060075198422618980592371180544447880729063
95242548339221982707404473162376760846613033778706
03980341319713349365462270056316993745550824178097
28109832913144035718775247685098572769379264332215
99399876886660808368837838027643282775172273657572
74478411229438973381086160742325329197481312019760
41782819656974758981645312584341359598627841301281
85406283476649088690521047580882615823961985770122
40704433058307586903931960460340497315658320867210
59133009037528234155397453943977152574552905102123
10947321610753474825740775273986348298498340756937
95564663862187456949927901657210370136443313581721
43117913982229838458473344402709641828510050729277
48364550578634501100852987812389473928699540834346
15880704395911898581514577917714361969872813145948
37832020814749821718580113890712282509058268174362
20577475921417653715687725614904582904992461028630
08153558330813010198767585623434353895540917562340
08448875261626435686488335194637203772932400944562
46923254350400678027273837755376406726898636241037
49141096671855705075909810024678988017827192595338
12824219540283027594084489550146766683896979968862
41636313376393903373455801407636741877711055384225
73949911018646821969658165148513049422236994771476
30691554682176828762003627772577237813653316111968
11280792669481887201298643660768551639860534602297
87155751794738524636944692308789426594821700805112
03223654962881690357391213683383935917564187338505
10970271613915439590991598154654417336311656936031
12224993796999922678173235802311186264457529913575
81750081998392362846152498810889602322443621737716
18086357015468484058622329792853875623486556440536
96262201896357102881236156751254333830327002909766
86505685571575055167275188991941297113376901499161
81315171544007728650573189557450920330185304847113
81831540732405331903846208403642176370391155063978
90007428536721962809034779745333204683687958685802
37952218629120080742819551317948157624448298518461
50970488802727472157468813159475040973211508049819
04558034168269497871413160632106863915116817743047
92596709376
结果结束。
set @xx=0x100000000....000 --2500位
我也是这种观点,基数小的效率不如基数大的,是因为我们无法通过SQL控制底层迭代器,因此基础运算时间被延长,同一个运算,同一种算法,虽然结果一样,但大部分由系统进行和大部分由手工进行的效率相差灰常大,而时间复杂度的概念应该是建立在运算时间相同的基础上,所以在这里是不适用的。所以我觉得大基数分段的算法是最适合MSSQL的了
用的是sqlserverdeclare @var varchar(3100)
decclare @v varchar(3100)
set @var = '2'
declare @i int
declare @l int
declare @jg int
delcrea @sws int
set @i = 1
while(@i<10000)
begin
set @i=@i+1
set @v = ''
set @l = LEN(@var)
set l1=0
set @sws = 0
while(@l1<@l)
begin
set @jg = CONVERT(int,substring(@var)-@l1)*2+@sws
if(@jg<10)
begin
set @sws = 0
set @v = CONVERT(varchar(2),@jg)+CONVERT(varchar(3100),@v)
end
else if(@jg>10)
begin
set @sws = @jg/10
set @v = convert(varchar(2),(@jg%10))+convert(varchar(3100),@v)
end
else
begin
set @sws = 1
set @v == '0' + convert(varchar(3100),@v)
end
set @l1 = @l1+1
end
if(@sws!=0)
set @var = convert(varchar(2),@sws)+convert(varchar(3100),@v)
else
set @var = @v
end
print @var
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
create FUNCTION [dbo].[powerX](@loopnumber int,@loopcount int)
RETURNS varchar(max)
AS
BEGINdeclare @str varchar(max)
declare @loop int
declare @len int
declare @num int
declare @add int
declare @output varchar(max)
set @str=cast(@loopnumber as varchar(max))
set @loop=1while (@loop<@loopcount)
begin
set @output=''
set @add=0
set @len=len(@str) while (@len!=0)
begin
set @num = cast(substring(@str,@len,1) as int)
set @num=@num*@loopnumber+@add
set @add=@num/10
set @output=cast(@num%10 as varchar(max)) +@output
set @len=@len-1
end
if(@add>=1)
begin
set @output = cast(@add as varchar(max))+@output
end
set @loop=@loop+1
set @str=@output
end
return @str
end