22,209
社区成员
发帖
与我相关
我的任务
分享
CREATE PROC getll(@sql1 nVARCHAR(20),@sql2 nVARCHAR(20),@sql3 nVARCHAR(20),@sql4 nVARCHAR(20),@sql5 nvarchar(20),@N INT,@r nvarchar(20) OUT )
AS
declare @sql nvarchar(500)
DECLARE @x INT ,@y INT, @c INT ,@d INT ,@e int
SET @sql=N'select @x='+@sql1+',@y='+@sql2+',@c='+@sql3+',@d='+@sql4 +',@e='+@sql5
exec sp_executesql @sql,N'@x int out,@y int out ,@c int out ,@d int out,@e int out',@x OUT,@y OUT ,@c OUT ,@d OUT ,@e OUT
IF @x=@n
SET @r=@sql1
ELSE IF @y =@n
SET @r=@sql2
ELSE IF @c=@n
SET @r=@sql3
ELSE IF @d=@N
SET @r=@sql4
ELSE IF @e=@n
SET @r=@sql5
ELSE
SET @r=''
RETURN
GO
DECLARE @a TABLE(a VARCHAR(2))
INSERT @a SELECT '3'
UNION ALL SELECT '4'
UNION ALL SELECT '5'
UNION ALL SELECT '6'
DECLARE @b TABLE(a VARCHAR(2))
INSERT @b SELECT '+'
UNION ALL SELECT '-'
UNION ALL SELECT '*'
UNION ALL SELECT '/'
DECLARE @s TABLE(a VARCHAR(100),b VARCHAR(100),c VARCHAR(100),d VARCHAR(100),e VARCHAR(100))
INSERT @s
SELECT x+a.a+a1.a+b.a+y+a2.a+c.a+a3.a+d.a a,
x+a.a+a1.a+b.a+a2.a+c.a+y+a3.a+d.a b,
a.a+a1.a+x+b.a+a2.a+c.a+y+a3.a+d.a c,
a.a+a1.a+x+b.a+a2.a+c.a+a3.a+d.a+y d,
a.a+a1.a+b.a+a2.a+x+c.a+a3.a+d.a+y e
FROM @a a,@a b,@a c,@a d,
@b a1,@b a2,@b a3,@b a4,(SELECT '(' x) xx, (SELECT ')' y)yy
WHERE a.a<>b.a AND a.a<>c.a AND a.a<>d.a AND b.a<>c.a AND b.a<>d.a AND c.a<>d.a
and a1.a<>a2.a AND a1.a<>a3.a AND a1.a<>a4.a
AND a2.a<>a3.a AND a2.a<>a4.a
AND a3.a<>a4.a
DECLARE @aa VARCHAR(20),@bb VARCHAR(20),@cc VARCHAR(20),@dd VARCHAR(20),@ee VARCHAR(20)
DECLARE @l VARCHAR(200)
DECLARE @r VARCHAR(20)
DECLARE @n INT
SET @n=24
DECLARE cur CURSOR FOR SELECT a,b,c,d,e FROM @s
OPEN cur
FETCH NEXT from cur INTO @aa ,@bb ,@cc ,@dd, @ee
WHILE @@FETCH_STATUS=0
BEGIN
EXEC getll @aa,@bb,@cc,@dd,@ee,@N,@l OUT
IF @l<>''
PRINT @l
FETCH NEXT FROM cur INTO @aa ,@bb ,@cc ,@dd, @ee
END
CLOSE CUR
DEALLOCATE cur
--使用示例:
exec myCal 3,4,5,6,28
/*
formula result
-----------------
(6/3+5)*4 28
*/
exec myCal 5,5,5,1
/*
formula result
-----------------
(5-(1/5))*5 24
*/
exec myCal -1,0,1.2,5
/*
请输入合法参数(正整数)
*/
if object_id('myCal','P') is not null
drop proc myCal
go
create proc myCal
@a dec(18,3),
@b dec(18,3),
@c dec(18,3),
@d dec(18,3),
@result int=24
as
set nocount on
--1.参数检查与初始化
if isnull(floor(@a),-1)<isnull(@a,0) or isnull(floor(@b),-1)<isnull(@b,0)
or isnull(floor(@c),-1)<isnull(@c,0) or isnull(floor(@d),-1)<isnull(@d,0)
begin
print '请输入合法参数(正整数)'
return
end
select id=identity(int),val into #val --数据表
from(select @a val union all select @b union all select @c union all select @d) t
select id=identity(int),sig into #sign --符号表
from(select '+' sig union all select '-' union all select '*' union all select '/') t
--2.先取两个数的所有有效组合
select a.id aid,s.id s1,b.id bid,a.val a,b.val b
,formula=rtrim(a.val)+s.sig+rtrim(b.val)
,result=case s.id when 1 then a.val+b.val when 2 then a.val-b.val when 3 then a.val*b.val when 4 then a.val/b.val end
into #1
from #val a,#sign s,#val b
where (s.id in(1,3) and a.id<b.id) or (s.id=2 and a.id<>b.id and a.val>=b.val) or (s.id=4 and a.id<>b.id)
--select * from #1
--3.加入第三个数
select a.aid,a.s1,a.bid,s.id s2,b.id cid,b.val c
,formula=case when a.s1 in(1,2) and s.id in(3,4) then '('+a.formula+')' else a.formula end + s.sig + rtrim(b.val)
,result=case s.id when 1 then a.result+b.val when 2 then a.result-b.val when 3 then a.result*b.val when 4 then a.result/b.val end
into #2
from #1 a,#sign s,#val b
where a.aid<>b.id and a.bid<>b.id and (s.id<>2 or s.id=2 and a.result>=b.val)
union all
select a.aid,a.s1,a.bid,s.id s2,b.id cid,b.val c
,formula=rtrim(b.val) + s.sig + '('+a.formula+')'
,result=case s.id when 2 then b.val-a.result when 4 then b.val/a.result end
from #1 a,#sign s,#val b
where a.aid<>b.id and a.bid<>b.id and (s.id=2 and a.result<b.val or s.id=4 and a.result>0)
--select * from #2
--4.加入第四个数
select formula=case when a.s2 in (1,2) and s.id in(3,4) then '('+a.formula+')' else a.formula end + s.sig + rtrim(b.val)
,result=case s.id when 1 then a.result+b.val when 2 then a.result-b.val when 3 then a.result*b.val when 4 then a.result/b.val end
into #3
from #2 a,#sign s,#val b
where a.aid<>b.id and a.bid<>b.id and a.cid<>b.id and (s.id<>2 or s.id=2 and a.result>=b.val)
union all
select formula=rtrim(b.val) + s.sig + '('+a.formula+')'
,result=case s.id when 2 then b.val-a.result when 4 then b.val/a.result end
from #2 a,#sign s,#val b
where a.aid<>b.id and a.bid<>b.id and a.cid<>b.id and (s.id=2 and a.result<b.val or s.id=4 and a.result>0)
--5.选取结果并格式化
select distinct formula=replace(formula,'.000',''),result=@result
from #3
where result=@result
go