日期:2014-05-19  浏览次数:20717 次

求一SQL语句,实现两个数据库表直接导数
如题~~~~~~

原表及数据:(原始表有N个)

tb1
id aa bb cc dd stime
1 11 22 33 44 2009-5-18
2 55 66 77 88 2009-5-19 

tb2
id ee ff gg hh stime
1 12 23 34 45 2009-5-18
2 56 67 78 89 2009-5-19  


导入表:tb3(想实现以下效果)

id sname svalue stime
1 a01 11 2009-5-18
2 b01 22 2009-5-18
3 c01 33 2009-5-18
4 d01 44 2009-5-18  
5 a01 55 2009-5-19
6 b01 66 2009-5-19
7 c01 77 2009-5-19
8 d01 88 2009-5-19
9 e01 12 2009-5-18
10 f01 23 2009-5-18
11 g01 34 2009-5-18
12 h01 45 2009-5-18
13 e01 56 2009-5-19
14 f01 67 2009-5-19
15 g01 78 2009-5-19
16 h01 89 2009-5-19

想实现把原始表中数据导入tb3表中,其中原始表和导入表不在同一个数据库,表的字段名也不相同,但可以写死,
比如tb1中aa对应的tb3中的就是a01
可以用一个小程序实现,条件就是选择原始表名和时间,点导入就把该表对应时间的数据导入到tb3中
想了半天没想出好的解决方法.
请个位帮帮忙,谁做过类似的例子给解答下.要是能用一个存储过程时间就更好了!
意思表达不清楚的请问~
100分笑纳~~

------解决方案--------------------
SQL code

insert into newdatabase.dbo.newdata(col1,col2,col3)
select col1,col2,col3
from olddata
where 条件

------解决方案--------------------
探讨
SQL codeSELECT 'A01',AA,stime FROM DB1.DBO.TB1
UNION ALL
SELECT 'B01',BB,stime FROM DB1.DBO.TB1
UNION ALL
SELECT 'C01',CC,stime FROM DB1.DBO.TB1
UNION ALL
SELECT 'D01',DD,stime FROM DB1.DBO.TB1
UNION ALL
SELECT 'E01',AA,stime FROM DB2.DBO.TB2
UNION ALL
SELECT 'F01',BB,stime FROM DB2.DBO.TB2
UNION ALL
SELECT 'G01',CC,stime FROM DB2.DBO.TB2
UNION ALL
SELECT 'H01',DD,stime FROM DB2.DB…

------解决方案--------------------
要用到行列转换,参照
SQL code
/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94
想变成(得到如下结果): 
姓名 课程 分数 
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/

create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go

--SQL SERVER 2000 静态SQL。
select * from
(
 select 姓名 , 课程 = '语文' , 分数 = 语文 from tb 
 union all
 select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
 union all
 select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end

--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns 
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')

--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

------解决方案--------------------
SQL code
DECLARE @TA TABLE([id] INT, [aa] INT, [bb] INT, [cc] INT, [dd] INT, [stime] DATETIME)
INSERT @TA 
SELECT 1, 11, 22, 33, 44, '2009-5-18' UNION ALL 
SELECT 2, 55, 66, 77, 88, '2009-5-19'

DECLARE @TB TABLE([id] INT, [ee] INT, [ff] INT, [gg] INT, [hh] INT, [stime] DATETIME)
INSERT @TB 
SELECT 1, 12, 23, 34, 45, '2009-5-18' UNION ALL 
SELECT 2, 56, 67, 78, 89, '2009-5-19'

SELECT id=row_number() over (order by px,id,seq),sname,svalue,stime INTO tb3
FROM (
SELECT px=0,id,seq=1,svalue=aa,sname='a01',stime FROM @TA 
UNION ALL
SELECT px=0,id,seq=2,bb,'b01',stime FROM @TA 
UNION ALL
SELECT px=0,id,seq=3,cc,'c01',stime FROM @TA 
UNION ALL
SELECT px=0,id,seq=4,dd,'d01',stime FROM @TA 
UNION ALL

SELECT px=1,id,seq=1,ee,'e01',stime FROM @TB 
UNION ALL
SELECT px=1,id,seq=2,ff,'f01',stime