专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Sql Server

求一SQL语句,实现两个数据库表直接导数解决思路

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
求一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 FROM @TB 
UNION ALL
SELECT px=1,id,seq=3,gg,'g01',stime FROM @TB 
UNION ALL
SELECT px=1,id,seq=4,hh,'h01',stime FROM @TB 
) T
ORDER BY px,id,seq

select * from tb3

drop table tb3
/*
id                   sname svalue      stime
-------------------- ----- ----------- -----------------------
1                    a01   11          2009-05-18 00:00:00.000
2                    b01   22          2009-05-18 00:00:00.000
3                    c01   33          2009-05-18 00:00:00.000
4                    d01   44          2009-05-18 00:00:00.000
5                    a01   55          2009-05-19 00:00:00.000
6                    b01   66          2009-05-19 00:00:00.000
7                    c01   77          2009-05-19 00:00:00.000
8                    d01   88          2009-05-19 00:00:00.000
9                    e01   12          2009-05-18 00:00:00.000
10                   f01   23          2009-05-18 00:00:00.000
11                   g01   34          2009-05-18 00:00:00.000
12                   h01   45          2009-05-18 00:00:00.000
13                   e01   56          2009-05-19 00:00:00.000
14                   f01   67          2009-05-19 00:00:00.000
15                   g01   78          2009-05-19 00:00:00.000
16                   h01   89          2009-05-19 00:00:00.000
*/
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: