如何将两个数据库合并到一起再进行操作

时间:2022-04-24 06:47:11
两个的数据库,表名、字段都相同,数据不同。
我想要添、查、删、改都和操作一个数据库一样。
比如我要在添加一条数据之前检查两个数据库中是否已经存在,如果不存在则添加到第二个数据库,如果存在则修改所在的数据库。

具体情况是这样的,我的服务商的数据库最大支持200M的数据库,而我的数据库现在马上就超过200M了,所以只能再开一个新数据库,但我还要对以前的数据进行检索和修改。新数据添加到第二个数据库。

程序早就写好了,不想做太大的改动,大家有什么好办法?

18 个解决方案

#1


例如表tb

if exists(select 1 from db1.dbo.tb where ...)
   update tb set ... from db1.dbo.tb where ...
else
   begin
     if exists(select 1 from db2.dbo.tb where ...)
        update tb set ... from db2.dbo.tb where ...
     else
        insert into db2.dbo.tb values(....)
   end


--如果两个库不同机,需要先链接.然后按照如下方法.
if exists(select 1 from machine1.db1.dbo.tb where ...)
   update tb set ... from machine1.db1.dbo.tb where ...
else
   begin
     if exists(select 1 from machine2.db2.dbo.tb where ...)
        update tb set ... from machine2.db2.dbo.tb where ...
     else
        insert into machine2.db2.dbo.tb values(....)
   end


不同服务器数据库之间的数据操作

--创建链接服务器 
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 本地表 

#2


不同服务器数据库之间的数据操作

--创建链接服务器 
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 本地表 

够强悍的....

#3


写instead of触发器 
比如 在第一个数据库的表1上写个update触发器

create trigger tri_tb1
on tb1
instead of update
as
if exists(select 1 from tb1 where id=inserted.id)
update tb1 set name=inserted.name,code=inserted.code
where id=inserted.id
else
update db2.dbo.tb1  set name=inserted.name,code=inserted.code
where id=inserted.id

#4


你回答的非常好,真是太专业了,你就是专家中的专家,不过我还是有点没全明白,比如,我要对两个数据同时检索该如何做?

#5


如何将两个数据库的搜索结果同时显示在前台?

#6


引用 4 楼 cnw168 的回复:
你回答的非常好,真是太专业了,你就是专家中的专家,不过我还是有点没全明白,比如,我要对两个数据同时检索该如何做?

什么意思?

SELECT * FROM A..A A INNER JOIN B..B B WHERE A.COL=B.COL

#7


引用 5 楼 cnw168 的回复:
如何将两个数据库的搜索结果同时显示在前台?

这是软件的功能,不是数据库或SQL语句能做到的.帮顶.

#8


我到是想到了一个比较简单的方法,就是在删除或修改的时修先判断ID字段,多少ID以后的的以后的调用不同的数据库就行了。不过就是现在同时对两个数据库进行检索还是没明白,有现成的SQL吗?

#9


引用 8 楼 cnw168 的回复:
我到是想到了一个比较简单的方法,就是在删除或修改的时修先判断ID字段,多少ID以后的的以后的调用不同的数据库就行了。不过就是现在同时对两个数据库进行检索还是没明白,有现成的SQL吗?

我在一楼就告诉你语句了.

#10


可能我说的不大明白,就是两个相同的数据库,名称字段都相同,就是内存不同,比如我要用like搜索关建字123,那么怎么能让它把两个数据库里包括123的内存全都显示出来。只要SQL语句那段

#11


如何将两个数据库合并到一起再进行操作

#12


具体情况是这样的,我的服务商的数据库最大支持200M的数据库,而我的数据库现在马上就超过200M了,所以只能再开一个新数据库,但我还要对以前的数据进行检索和修改。新数据添加到第二个数据库。

两个数据库的结构一样吗?


SELECT  * FROM 
(SELECT * FROM A..A UNION ALL SELECT * FROM B..B)AS T

#13


引用 10 楼 cnw168 的回复:
可能我说的不大明白,就是两个相同的数据库,名称字段都相同,就是内存不同,比如我要用like搜索关建字123,那么怎么能让它把两个数据库里包括123的内存全都显示出来。只要SQL语句那段


SELECT  * FROM 
(SELECT * FROM A..A UNION ALL SELECT * FROM B..B)AS T WHERE COL LIKE '%123%'

#14


uping uping

#15


引用 10 楼 cnw168 的回复:
可能我说的不大明白,就是两个相同的数据库,名称字段都相同,就是内存不同,比如我要用like搜索关建字123,那么怎么能让它把两个数据库里包括123的内存全都显示出来。只要SQL语句那段

select * from db1.dbo.tb where col like '%123%'
union all
select * from db2.dbo.tb where col like '%123%'



select * from db1.dbo.tb where charindex('123',col) > 0
union all
select * from db2.dbo.tb where charindex('123',col) > 0

#16


假如你的两个数据库分别为db1和db2
首先看你的两个数据库是否在一台机器上:
1.若两个库在一台机器上,要在连接db2的查询分析器中查询db1中的数据,像这样
 select * from db1.dbo.表名
2.若两个库不在同一台机器上,参见1楼和2楼,不明白的系统存储过程,请查询相关的帮助。


若再不明白,可以分别连接两个数据库,进行检索和插入、修改数据

#17


我在研究研究吧。

数据库A 和数据库B

表名都是table

每个表有两个字段id和NAME

库A 表table
id      name
1       846412365
2       sdfds123sdf
3       sdfsd

库B 表table
id       name
4        123
5        sdfsd

现在我要找出库A和库B里所有包括123的信息该怎么写?
select id,name form table where name like '%123%'
就是类似这样的,该怎么写才正确?是否需要先把两个数据库全都打开再操作。

#18


明白了,这还有个一样的帖子,你们去一下把分领了吧。
http://topic.csdn.net/u/20100419/20/edadcbdd-3873-46b2-b896-da1ea635c04c.html?seed=1208532310&r=64795877#r_64795877

#1


例如表tb

if exists(select 1 from db1.dbo.tb where ...)
   update tb set ... from db1.dbo.tb where ...
else
   begin
     if exists(select 1 from db2.dbo.tb where ...)
        update tb set ... from db2.dbo.tb where ...
     else
        insert into db2.dbo.tb values(....)
   end


--如果两个库不同机,需要先链接.然后按照如下方法.
if exists(select 1 from machine1.db1.dbo.tb where ...)
   update tb set ... from machine1.db1.dbo.tb where ...
else
   begin
     if exists(select 1 from machine2.db2.dbo.tb where ...)
        update tb set ... from machine2.db2.dbo.tb where ...
     else
        insert into machine2.db2.dbo.tb values(....)
   end


不同服务器数据库之间的数据操作

--创建链接服务器 
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 本地表 

#2


不同服务器数据库之间的数据操作

--创建链接服务器 
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 本地表 

够强悍的....

#3


写instead of触发器 
比如 在第一个数据库的表1上写个update触发器

create trigger tri_tb1
on tb1
instead of update
as
if exists(select 1 from tb1 where id=inserted.id)
update tb1 set name=inserted.name,code=inserted.code
where id=inserted.id
else
update db2.dbo.tb1  set name=inserted.name,code=inserted.code
where id=inserted.id

#4


你回答的非常好,真是太专业了,你就是专家中的专家,不过我还是有点没全明白,比如,我要对两个数据同时检索该如何做?

#5


如何将两个数据库的搜索结果同时显示在前台?

#6


引用 4 楼 cnw168 的回复:
你回答的非常好,真是太专业了,你就是专家中的专家,不过我还是有点没全明白,比如,我要对两个数据同时检索该如何做?

什么意思?

SELECT * FROM A..A A INNER JOIN B..B B WHERE A.COL=B.COL

#7


引用 5 楼 cnw168 的回复:
如何将两个数据库的搜索结果同时显示在前台?

这是软件的功能,不是数据库或SQL语句能做到的.帮顶.

#8


我到是想到了一个比较简单的方法,就是在删除或修改的时修先判断ID字段,多少ID以后的的以后的调用不同的数据库就行了。不过就是现在同时对两个数据库进行检索还是没明白,有现成的SQL吗?

#9


引用 8 楼 cnw168 的回复:
我到是想到了一个比较简单的方法,就是在删除或修改的时修先判断ID字段,多少ID以后的的以后的调用不同的数据库就行了。不过就是现在同时对两个数据库进行检索还是没明白,有现成的SQL吗?

我在一楼就告诉你语句了.

#10


可能我说的不大明白,就是两个相同的数据库,名称字段都相同,就是内存不同,比如我要用like搜索关建字123,那么怎么能让它把两个数据库里包括123的内存全都显示出来。只要SQL语句那段

#11


如何将两个数据库合并到一起再进行操作

#12


具体情况是这样的,我的服务商的数据库最大支持200M的数据库,而我的数据库现在马上就超过200M了,所以只能再开一个新数据库,但我还要对以前的数据进行检索和修改。新数据添加到第二个数据库。

两个数据库的结构一样吗?


SELECT  * FROM 
(SELECT * FROM A..A UNION ALL SELECT * FROM B..B)AS T

#13


引用 10 楼 cnw168 的回复:
可能我说的不大明白,就是两个相同的数据库,名称字段都相同,就是内存不同,比如我要用like搜索关建字123,那么怎么能让它把两个数据库里包括123的内存全都显示出来。只要SQL语句那段


SELECT  * FROM 
(SELECT * FROM A..A UNION ALL SELECT * FROM B..B)AS T WHERE COL LIKE '%123%'

#14


uping uping

#15


引用 10 楼 cnw168 的回复:
可能我说的不大明白,就是两个相同的数据库,名称字段都相同,就是内存不同,比如我要用like搜索关建字123,那么怎么能让它把两个数据库里包括123的内存全都显示出来。只要SQL语句那段

select * from db1.dbo.tb where col like '%123%'
union all
select * from db2.dbo.tb where col like '%123%'



select * from db1.dbo.tb where charindex('123',col) > 0
union all
select * from db2.dbo.tb where charindex('123',col) > 0

#16


假如你的两个数据库分别为db1和db2
首先看你的两个数据库是否在一台机器上:
1.若两个库在一台机器上,要在连接db2的查询分析器中查询db1中的数据,像这样
 select * from db1.dbo.表名
2.若两个库不在同一台机器上,参见1楼和2楼,不明白的系统存储过程,请查询相关的帮助。


若再不明白,可以分别连接两个数据库,进行检索和插入、修改数据

#17


我在研究研究吧。

数据库A 和数据库B

表名都是table

每个表有两个字段id和NAME

库A 表table
id      name
1       846412365
2       sdfds123sdf
3       sdfsd

库B 表table
id       name
4        123
5        sdfsd

现在我要找出库A和库B里所有包括123的信息该怎么写?
select id,name form table where name like '%123%'
就是类似这样的,该怎么写才正确?是否需要先把两个数据库全都打开再操作。

#18


明白了,这还有个一样的帖子,你们去一下把分领了吧。
http://topic.csdn.net/u/20100419/20/edadcbdd-3873-46b2-b896-da1ea635c04c.html?seed=1208532310&r=64795877#r_64795877