A问题:有两个服务器一和服务器二,服务器一中的数据库D1,其中有一表为T1,服务器二的数据库为D2,其中有一表为T2,T1和T2的结构一样,现在想将服务器一中的T1表的数据插入到服务器二中的T2表中,请问在SQL管理中的作业中的Transact-SQL语句如何编写?
备注:如服务器一的信息:IP:1.x.x.x,用户名:a密码:123 服务器二的信息:IP:2.x.x.x,用户名:b密码:456
B问题:如果是同一服务器中的两个不同数据库表又如何编写呢?
备注:数据库D1,表为T1,数据库D2,表为T2
说明:两个数据库的结构都如上图所示,其中表T1是用户每天登录系统的登录日志,现在想从表T1中抓取每个用户每天最早登录的哪一条记录插入到空表T2中。
不同服务器数据库之间的数据操作--创建链接服务器
exec sp_addlinkedserver 'ITSV' , '' , 'SQLOLEDB' , '远程服务器名或ip地址'
exec sp_addlinkedsrvlogin 'ITSV' , 'false' , null , '用户名' , '密码' --查询示例
select * from ITSV.数据库名.dbo.表名 --导入示例
select * into 表 from ITSV.数据库名.dbo.表名 --以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV' , 'droplogins' --连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset --查询示例
select * from openrowset('SQLOLEDB' , 'sql服务器名' ; '用户名' ; '密码' , 数据库名.dbo.表名) --生成本地表
select * into 表 from openrowset('SQLOLEDB' , 'sql服务器名' ; '用户名' ; '密码' , 数据库名.dbo.表名) --把本地表导入远程表
insert openrowset( 'SQLOLEDB' , 'sql服务器名' ; '用户名' ; '密码' , 数据库名.dbo.表名)
select *from 本地表 --更新本地表
update b
set b.列A=a.列A
from openrowset('SQLOLEDB' , 'sql服务器名' ; '用户名' ; '密码' , 数据库名.dbo.表名) as a inner join 本地表 b
on a.column1 = b.column1 --openquery用法需要创建一个连接 --首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV' , '' , 'SQLOLEDB' , '远程服务器名或ip地址'
--查询
select *
FROM openquery(ITSV , 'SELECT * FROM 数据库.dbo.表名')
--把本地表导入远程表
insert openquery(ITSV , 'SELECT * FROM 数据库.dbo.表名')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV , 'SELECT * FROM 数据库.dbo.表名') as a
inner join 本地表 b on a.列A=b.列A --3、opendatasource/openrowset
SELECT *
FROM opendatasource('SQLOLEDB' , 'Data Source=ip/ServerName ; User ID=登陆名 ; Password=密码').test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource('SQLOLEDB' , 'Data Source=ip/ServerName ; User ID=登陆名 ; Password=密码').数据库.dbo.表名
select * from 本地表
A问题:
--创建链接服务器 IP1
exec sp_addlinkedserver 'ITSV1' , '' , 'SQLOLEDB' , 'IP1'
exec sp_addlinkedsrvlogin 'ITSV1' , 'false' , null , 'a' , '123'--创建链接服务器 IP2
exec sp_addlinkedserver 'ITSV2' , '' , 'SQLOLEDB' , 'IP2'
exec sp_addlinkedsrvlogin 'ITSV2' , 'false' , null , 'b' , '456'insert into ITSV2.D2.dbo.T2
select * from ITSV1.D1.dbo.T1
B问题:insert into D2.dbo.T2
select * from T1 --这时候你选择的数据库是T1,或者直接D1.dbo.T1-- 获取最早记录应该很容易吧!
-- 不知正确不!
说明:两个数据库的结构都如上图所示,其中表T1是用户每天登录系统的登录日志,现在想从表T1中抓取每个用户每天最早登录的哪一条记录插入到空表T2中。请帮忙写出在同一服务器中的两个不同数据库的SQL语句
select * into [D2].dbo.[T2] from [D1].dbo.[T1]
select t.* into [D2].dbo.[T2]
from [D1].dbo.[T1] t,
(select userid,min(oper_datetime)oper_datetime
from [D1].dbo.[T1] e
group by userid,convert(varchar(8),oper_datetime,112))h
where t.userid = h.userid and t.oper_datetime = h.oper_datetime
order by t.userid