--笨人只有笨方法 --抛块砖试试,希望能引来美玉 --速度很慢,别在使用中的服务器测试--建表 create table a( a int ) go create table b( b int ) go--放结果 create table c( ida varchar(100), idb varchar(100) ) go--说明:本来想用很多数据的,测试证明,实在太慢,删除了 /* insert a select top 100 a+b+c+d+e+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b,( select 0 as c union all select 100 union all select 200 union all select 300 union all select 400 union all select 500 union all select 600 union all select 700 union all select 800 union all select 900 ) as c,( select 0 as d union all select 1000 union all select 2000 union all select 3000 union all select 4000 union all select 5000 union all select 6000 union all select 7000 union all select 8000 union all select 9000 ) as d,( select 0 as e union all select 10000 union all select 20000 union all select 30000 union all select 40000 union all select 50000 union all select 60000 union all select 70000 union all select 80000 union all select 90000 ) as e order by newid()goinsert b select top 100 a+b+c+d+e+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b,( select 0 as c union all select 100 union all select 200 union all select 300 union all select 400 union all select 500 union all select 600 union all select 700 union all select 800 union all select 900 ) as c,( select 0 as d union all select 1000 union all select 2000 union all select 3000 union all select 4000 union all select 5000 union all select 6000 union all select 7000 union all select 8000 union all select 9000 ) as d,( select 0 as e union all select 10000 union all select 20000 union all select 30000 union all select 40000 union all select 50000 union all select 60000 union all select 70000 union all select 80000 union all select 90000 ) as e order by newid()go */
--现在使用25X25 1-100可能重复的数据测试,耗时14分钟,找到15对数据 insert a select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()goinsert a select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()goinsert a select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()goinsert a select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()goinsert a select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()goinsert b select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()goinsert b select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()goinsert b select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()goinsert b select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()goinsert b select top 5 a+b+1 from ( select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 ) as a,( select 0 as b union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90 ) as b order by newid()go
--连续回复不能超过三次,只好动用马甲了--建立一个辅助函数 create function GetSql(@num int,@FName varchar(30),@TName varchar(30)) returns varchar(2000) as begin declare @r varchar(2000) set @r='' if @num <=0 return @r declare @a varchar(400) set @a='a1.'+@FName declare @id varchar(1000) set @id='cast(a1.id as varchar(10))' declare @from varchar(400) set @from=@TName+' a1' declare @where varchar(1000) set @where='a1.checked=0' declare @i int set @i =2 while @i<=@num begin set @a=@a+'+a'+cast(@i as varchar(10))+'.'+@FName set @id=@id+'+'',''+cast(a'+cast(@i as varchar(10))+'.id as varchar(10))' set @from=@from+','+@TName+' a'+cast(@i as varchar(10)) set @where=@where+' and a'+cast(@i as varchar(10))+'.checked=0 and a'+cast(@i-1 as varchar(10))+'.id<a'+cast(@i as varchar(10))+'.id' set @i=@i+1 end set @r='select '+@FName+'='+@a+',id='+@id+' from '+@from+' where '+@where return @r endgo --一下是检查代码 select IDENTITY(int,1,1) as id,0 as checked,* into #a from a select IDENTITY(int,1,1) as id,0 as checked,* into #b from b declare @i int set @i =1 declare @j int set @j =1 declare @k intdeclare @sql varchar(2000) declare @a int declare @b int declare @Ida varchar(100) declare @Idb varchar(100)BeginOf: set @i =1 set @j =1 set @sql='' set @a=null set @b=null set @ida=null set @idb=nullwhile @i<10 begin set @sql=dbo.GetSql(@i,'a','#a') set @sql='declare curA INSENSITIVE CURSOR for '+@sql +' order by a1.id for READ ONLY ' exec (@sql) open curA FETCH NEXT FROM curA INTO @a,@ida WHILE @@FETCH_STATUS = 0 begin set @j=1 while @j<10 begin set @sql=dbo.GetSql(@j,'b','#b') set @sql='declare curB INSENSITIVE CURSOR for '+@sql +' order by a1.id for READ ONLY ' exec (@sql) open curB FETCH NEXT FROM curB INTO @b,@idb WHILE @@FETCH_STATUS = 0 begin if @a=@b --呵呵,好不容易找到一个 begin exec('update #a set Checked=1 where id in ('+@ida+')') exec('update #b set Checked=1 where id in ('+@idb+')') insert c values(@ida,@idb) CLOSE curA DEALLOCATE curA CLOSE curB DEALLOCATE curB goto BeginOf end FETCH NEXT FROM curB INTO @b,@idb end set @j=@j+1 CLOSE curB DEALLOCATE curB end FETCH NEXT FROM curA INTO @a,@ida end set @i=@i+1 CLOSE curA DEALLOCATE curA end select sum(a) as suma from #a where checked=1 select sum(b) as sumb from #b where checked=1select * from #b where checked=0 select * from #a where checked=0select * from c结果:suma ----------- 1094(所影响的行数为 1 行)sumb ----------- 1094(所影响的行数为 1 行) id checked b ----------- ----------- ----------- 6 0 93 20 0 65(所影响的行数为 2 行)id checked a ----------- ----------- ----------- 5 0 76 7 0 36 8 0 3 20 0 87(所影响的行数为 4 行) ida idb ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- 11 7,22 12 9,11 14 23,24 15 10,17,25 18 4,21 21 14 3 1 4 18 6 3 9 8,13 10,23 19 16,19 5 17,22 12 24,25 2,15 1,2,13 16(所影响的行数为 15 行) --删除临时表 drop table #a drop table #b--删除测试环境 drop function GetSql drop table a drop table b drop table c
--抛块砖试试,希望能引来美玉
--速度很慢,别在使用中的服务器测试--建表
create table a(
a int
)
go
create table b(
b int
)
go--放结果
create table c(
ida varchar(100),
idb varchar(100)
)
go--说明:本来想用很多数据的,测试证明,实在太慢,删除了
/*
insert a
select top 100 a+b+c+d+e+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b,(
select 0 as c union all select 100 union all select 200
union all select 300 union all select 400 union all select 500
union all select 600 union all select 700 union all select 800
union all select 900
) as c,(
select 0 as d union all select 1000 union all select 2000
union all select 3000 union all select 4000 union all select 5000
union all select 6000 union all select 7000 union all select 8000
union all select 9000
) as d,(
select 0 as e union all select 10000 union all select 20000
union all select 30000 union all select 40000 union all select 50000
union all select 60000 union all select 70000 union all select 80000
union all select 90000
) as e
order by newid()goinsert b
select top 100 a+b+c+d+e+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b,(
select 0 as c union all select 100 union all select 200
union all select 300 union all select 400 union all select 500
union all select 600 union all select 700 union all select 800
union all select 900
) as c,(
select 0 as d union all select 1000 union all select 2000
union all select 3000 union all select 4000 union all select 5000
union all select 6000 union all select 7000 union all select 8000
union all select 9000
) as d,(
select 0 as e union all select 10000 union all select 20000
union all select 30000 union all select 40000 union all select 50000
union all select 60000 union all select 70000 union all select 80000
union all select 90000
) as e
order by newid()go
*/
insert a
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()goinsert a
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()goinsert a
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()goinsert a
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()goinsert a
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()goinsert b
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()goinsert b
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()goinsert b
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()goinsert b
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()goinsert b
select top 5 a+b+1
from (
select 0 as a union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9
) as a,(
select 0 as b union all select 10 union all select 20
union all select 30 union all select 40 union all select 50
union all select 60 union all select 70 union all select 80
union all select 90
) as b
order by newid()go
create function GetSql(@num int,@FName varchar(30),@TName varchar(30))
returns varchar(2000)
as
begin
declare @r varchar(2000)
set @r=''
if @num <=0 return @r
declare @a varchar(400)
set @a='a1.'+@FName
declare @id varchar(1000)
set @id='cast(a1.id as varchar(10))'
declare @from varchar(400)
set @from=@TName+' a1'
declare @where varchar(1000)
set @where='a1.checked=0'
declare @i int
set @i =2
while @i<=@num
begin
set @a=@a+'+a'+cast(@i as varchar(10))+'.'+@FName
set @id=@id+'+'',''+cast(a'+cast(@i as varchar(10))+'.id as varchar(10))'
set @from=@from+','+@TName+' a'+cast(@i as varchar(10))
set @where=@where+' and a'+cast(@i as varchar(10))+'.checked=0 and a'+cast(@i-1 as varchar(10))+'.id<a'+cast(@i as varchar(10))+'.id'
set @i=@i+1
end
set @r='select '+@FName+'='+@a+',id='+@id+' from '+@from+' where '+@where
return @r
endgo
--一下是检查代码
select IDENTITY(int,1,1) as id,0 as checked,* into #a from a
select IDENTITY(int,1,1) as id,0 as checked,* into #b from b
declare @i int
set @i =1
declare @j int
set @j =1
declare @k intdeclare @sql varchar(2000)
declare @a int
declare @b int
declare @Ida varchar(100)
declare @Idb varchar(100)BeginOf:
set @i =1
set @j =1
set @sql=''
set @a=null
set @b=null
set @ida=null
set @idb=nullwhile @i<10
begin
set @sql=dbo.GetSql(@i,'a','#a')
set @sql='declare curA INSENSITIVE CURSOR for '+@sql +' order by a1.id for READ ONLY '
exec (@sql)
open curA
FETCH NEXT FROM curA
INTO @a,@ida
WHILE @@FETCH_STATUS = 0
begin
set @j=1
while @j<10
begin
set @sql=dbo.GetSql(@j,'b','#b')
set @sql='declare curB INSENSITIVE CURSOR for '+@sql +' order by a1.id for READ ONLY '
exec (@sql)
open curB
FETCH NEXT FROM curB
INTO @b,@idb
WHILE @@FETCH_STATUS = 0
begin
if @a=@b --呵呵,好不容易找到一个
begin
exec('update #a set Checked=1 where id in ('+@ida+')')
exec('update #b set Checked=1 where id in ('+@idb+')')
insert c values(@ida,@idb)
CLOSE curA
DEALLOCATE curA
CLOSE curB
DEALLOCATE curB
goto BeginOf
end
FETCH NEXT FROM curB
INTO @b,@idb
end
set @j=@j+1
CLOSE curB
DEALLOCATE curB
end
FETCH NEXT FROM curA
INTO @a,@ida
end
set @i=@i+1
CLOSE curA
DEALLOCATE curA
end
select sum(a) as suma from #a where checked=1
select sum(b) as sumb from #b where checked=1select * from #b where checked=0
select * from #a where checked=0select * from c结果:suma
-----------
1094(所影响的行数为 1 行)sumb
-----------
1094(所影响的行数为 1 行)
id checked b
----------- ----------- -----------
6 0 93
20 0 65(所影响的行数为 2 行)id checked a
----------- ----------- -----------
5 0 76
7 0 36
8 0 3
20 0 87(所影响的行数为 4 行)
ida idb
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
11 7,22
12 9,11
14 23,24
15 10,17,25
18 4,21
21 14
3 1
4 18
6 3
9 8,13
10,23 19
16,19 5
17,22 12
24,25 2,15
1,2,13 16(所影响的行数为 15 行)
--删除临时表
drop table #a
drop table #b--删除测试环境
drop function GetSql
drop table a
drop table b
drop table c