请教一个关于跨数据库插入数据的问题

静远 2010-03-29 05:40:43

数据库A中TableA
//ID号无序
ID Name
0000000061 湛江市公路工程质量监测站
0000000090 湛江市建筑工程质量检测站
0000000093 广东建科建筑工程质量检测中心 //存在相同的数据,不插入
0000000026 肇庆市鼎星公路监理有限公司检测中心
0000000006 肇庆市公路工程质量检测站
0000000096 肇庆市交通工程质量监督管理站

数据库B中TableB
//AID有序
AID corpname corptype
0000022692 佛山市盛方达建设工程检测有限公司 010
0000022693 广东冠粤路桥有限公司中心试验室 010
0000022694 广东虎门技术咨询有限公司中心试验室 010
0000022695 广东惠州公路建设总公司中心试验室 010
0000022696 广东建科建筑工程质量检测中心 010
0000022697 广东建粤工程检测有限公司 010
0000022698 广东交通集团检测中心 010


我想把TableA中的数据插入TableB中,表格名字和列名都不同,ID和AID都为主键,属于varchar类型无自增,同时,TableB中可能存在corpname与TableA中Name相同的数据,这样的情况下,TableA的数据不插入。最后我想要的结果:
AID corpname corptype
0000022692 佛山市盛方达建设工程检测有限公司 010
0000022693 广东冠粤路桥有限公司中心试验室 010
0000022694 广东虎门技术咨询有限公司中心试验室 010
0000022695 广东惠州公路建设总公司中心试验室 010
0000022696 广东建科建筑工程质量检测中心 010
0000022697 广东建粤工程检测有限公司 010
0000022698 广东交通集团检测中心 010
//下面三行为从TableA中插入的数据,AID号可以不连续,但需有序
0000022699 湛江市公路工程质量监测站 010
0000022700 湛江市建筑工程质量检测站 010
0000022711 肇庆市鼎星公路监理有限公司检测中心 010
0000022712 肇庆市公路工程质量检测站 010
0000022714 肇庆市交通工程质量监督管理站 010 //此处AID不连续,但有序

多谢!
...全文
185 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
东那个升 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 eriato 的回复:]
引用 14 楼 ldslove 的回复:
引用 11 楼 eriato 的回复:
引用 7 楼 htl258 的回复:
引用 6 楼 eriato 的回复:
引用 1 楼 htl258 的回复:
数据库B中TableB的AID是否为自增列?

不是自增的,如果是自增的就好了,可以不用管他

数据库是什么版本?

不好意思,忘了说环境了
是SQL2005开发版


5#……
[/Quote]

消耗应该是一样。。。。。。。
静远 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ldslove 的回复:]
引用 11 楼 eriato 的回复:
引用 7 楼 htl258 的回复:
引用 6 楼 eriato 的回复:
引用 1 楼 htl258 的回复:
数据库B中TableB的AID是否为自增列?

不是自增的,如果是自增的就好了,可以不用管他

数据库是什么版本?

不好意思,忘了说环境了
是SQL2005开发版


5#,8#应该都可以的。。。
[/Quote]
嗯,都可以

还请教下,在数据量比较多的时候,8#和12#的哪个效率高些?
SQL77 2010-03-29
  • 打赏
  • 举报
回复
0000022699 湛江市公路工程质量监测站 010
0000022700 湛江市建筑工程质量检测站 010
0000022711 肇庆市鼎星公路监理有限公司检测中心 010
0000022712 肇庆市公路工程质量检测站 010
0000022714 肇庆市交通工程质量监督管理站 010 //此处AID不连续,但有序

硬是没看懂这些怎么来的,如果是按前面的增的话,楼上的大牛们可以
东那个升 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 eriato 的回复:]
引用 7 楼 htl258 的回复:
引用 6 楼 eriato 的回复:
引用 1 楼 htl258 的回复:
数据库B中TableB的AID是否为自增列?

不是自增的,如果是自增的就好了,可以不用管他

数据库是什么版本?

不好意思,忘了说环境了
是SQL2005开发版
[/Quote]

5#,8#应该都可以的。。。
htl258_Tony 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 eriato 的回复:]
引用 7 楼 htl258 的回复:
引用 6 楼 eriato 的回复:
引用 1 楼 htl258 的回复:
数据库B中TableB的AID是否为自增列?

不是自增的,如果是自增的就好了,可以不用管他

数据库是什么版本?

不好意思,忘了说环境了
是SQL2005开发版
[/Quote]5楼代码可以执行
htl258_Tony 2010-03-29
  • 打赏
  • 举报
回复
--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-03-29 17:50:12
-- Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------
--> 生成测试数据表:t1

IF NOT OBJECT_ID('[t1]') IS NULL
DROP TABLE [t1]
GO
CREATE TABLE [t1]([ID] NVARCHAR(10),[Name] NVARCHAR(20))
INSERT [t1]
SELECT '0000000061',N'湛江市公路工程质量监测站' UNION ALL
SELECT '0000000090',N'湛江市建筑工程质量检测站' UNION ALL
SELECT '0000000093',N'广东建科建筑工程质量检测中心' UNION ALL
SELECT '0000000026',N'肇庆市鼎星公路监理有限公司检测中心' UNION ALL
SELECT '0000000006',N'肇庆市公路工程质量检测站' UNION ALL
SELECT '0000000096',N'肇庆市交通工程质量监督管理站'
GO
--SELECT * FROM [t1]

--> 生成测试数据表:t2

IF NOT OBJECT_ID('[t2]') IS NULL
DROP TABLE [t2]
GO
CREATE TABLE [t2]([AID] NVARCHAR(10),[corpname] NVARCHAR(20),[corptype] NVARCHAR(10))
INSERT [t2]
SELECT '0000022692',N'佛山市盛方达建设工程检测有限公司','010' UNION ALL
SELECT '0000022693',N'广东冠粤路桥有限公司中心试验室','010' UNION ALL
SELECT '0000022694',N'广东虎门技术咨询有限公司中心试验室','010' UNION ALL
SELECT '0000022695',N'广东惠州公路建设总公司中心试验室','010' UNION ALL
SELECT '0000022696',N'广东建科建筑工程质量检测中心','010' UNION ALL
SELECT '0000022697',N'广东建粤工程检测有限公司','010' UNION ALL
SELECT '0000022698',N'广东交通集团检测中心','010'
GO
--SELECT * FROM [t2]

-->SQL2000查询如下:
select rn=identity(int),* into # from t1 t where not exists(select 1 from t2 where [corpname]=t.[Name])
insert t2
select right('0000000000'+ltrim((select MAX(aid) from t2)+rn),10),[Name],'010' from #
drop table #
select * from t2
/*
AID corpname corptype
0000022692 佛山市盛方达建设工程检测有限公司 010
0000022693 广东冠粤路桥有限公司中心试验室 010
0000022694 广东虎门技术咨询有限公司中心试验室 010
0000022695 广东惠州公路建设总公司中心试验室 010
0000022696 广东建科建筑工程质量检测中心 010
0000022697 广东建粤工程检测有限公司 010
0000022698 广东交通集团检测中心 010
0000022699 湛江市公路工程质量监测站 010
0000022700 湛江市建筑工程质量检测站 010
0000022701 肇庆市鼎星公路监理有限公司检测中心 010
0000022702 肇庆市公路工程质量检测站 010
0000022703 肇庆市交通工程质量监督管理站 010
*/
静远 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 htl258 的回复:]
引用 6 楼 eriato 的回复:
引用 1 楼 htl258 的回复:
数据库B中TableB的AID是否为自增列?

不是自增的,如果是自增的就好了,可以不用管他

数据库是什么版本?
[/Quote]
不好意思,忘了说环境了
是SQL2005开发版
静远 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jiangshun 的回复:]
SQL code

--> 测试数据:[TA]
if object_id('[TA]') is not null drop table [TA]
create table [TA]([ID] varchar(10),[Name] varchar(34))
insert [TA]
select '0000000061','湛江市公路工程质量监测站' union all
select '……
[/Quote]
谢谢回复!
不过你可能没有看明白,我想要的结果是TableA中插入过来的数据中ID是接着TableB中的AID继续下去的,而不是仅仅把TableA中的数据插入TableB中。
tim_spac 2010-03-29
  • 打赏
  • 举报
回复
select identity(int,1,1) as id, name 
into #tB
from tableA a
where not exists (select 1 from tableB b
where b.corpname = a.name)

declare @base int
select @base = max(AID) from tableB

insert into tableB
select id+@base, name from #tB
东那个升 2010-03-29
  • 打赏
  • 举报
回复
create table #TableA(ID varchar(20),Name varchar(50))
insert #TableA select '0000000061','湛江市公路工程质量监测站'
insert #TableA select '0000000090','湛江市建筑工程质量检测站'
insert #TableA select '0000000093','广东建科建筑工程质量检测中心'
insert #TableA select '0000000026','肇庆市鼎星公路监理有限公司检测中心'
insert #TableA select '0000000006','肇庆市公路工程质量检测站'
insert #TableA select '0000000096','肇庆市交通工程质量监督管理站'

create table #TableB(AID varchar(20),corpname varchar(50),corptype varchar(10))

insert #TableB select '0000022692','佛山市盛方达建设工程检测有限公司','010'
insert #TableB select '0000022693','广东冠粤路桥有限公司中心试验室','010'
insert #TableB select '0000022694','广东虎门技术咨询有限公司中心试验室','010'
insert #TableB select '0000022695','广东惠州公路建设总公司中心试验室','010'
insert #TableB select '0000022696','广东建科建筑工程质量检测中心','010'
insert #TableB select '0000022697','广东建粤工程检测有限公司','010'
insert #TableB select '0000022698','广东交通集团检测中心','010'





declare @i bigint
select @i=cast(max(AID) as INT) from #TableB

INSERT #TableB
select RIGHT(REPLICATE('0',10)+LTRIM(@i+ROW_NUMBER() OVER(ORDER BY GETDATE())),10),Name,'010' from #TableA A
where not exists(select 1 from #Tableb b WHERE a.name=b.corpname)

--declare @i bigint
--select @i=cast(max(AID) as INT) from #TableB
--
--INSERT 数据库B..TableB
--
--select RIGHT(REPLICATE('0',10)+LTRIM(@i+ROW_NUMBER() OVER(ORDER BY GETDATE())),9),Name,'010' from 数据库A..#TableA A
--where not exists(select 1 from 数据库B..TableB b WHERE a.name=b.corpname)

SELECT * FROM #TableB


AID corpname corptype
-------------------- -------------------------------------------------- ----------
0000022692 佛山市盛方达建设工程检测有限公司 010
0000022693 广东冠粤路桥有限公司中心试验室 010
0000022694 广东虎门技术咨询有限公司中心试验室 010
0000022695 广东惠州公路建设总公司中心试验室 010
0000022696 广东建科建筑工程质量检测中心 010
0000022697 广东建粤工程检测有限公司 010
0000022698 广东交通集团检测中心 010
0000022699 湛江市公路工程质量监测站 010
0000022700 湛江市建筑工程质量检测站 010
0000022701 肇庆市鼎星公路监理有限公司检测中心 010
0000022702 肇庆市公路工程质量检测站 010
0000022703 肇庆市交通工程质量监督管理站 010

(12 行受影响)
htl258_Tony 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 eriato 的回复:]
引用 1 楼 htl258 的回复:
数据库B中TableB的AID是否为自增列?

不是自增的,如果是自增的就好了,可以不用管他
[/Quote]
数据库是什么版本?
静远 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 htl258 的回复:]
数据库B中TableB的AID是否为自增列?
[/Quote]
不是自增的,如果是自增的就好了,可以不用管他
htl258_Tony 2010-03-29
  • 打赏
  • 举报
回复
看出来了,ID非自增列.

--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-03-29 17:50:12
-- Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------
--> 生成测试数据表:t1

IF NOT OBJECT_ID('[t1]') IS NULL
DROP TABLE [t1]
GO
CREATE TABLE [t1]([ID] NVARCHAR(10),[Name] NVARCHAR(20))
INSERT [t1]
SELECT '0000000061',N'湛江市公路工程质量监测站' UNION ALL
SELECT '0000000090',N'湛江市建筑工程质量检测站' UNION ALL
SELECT '0000000093',N'广东建科建筑工程质量检测中心' UNION ALL
SELECT '0000000026',N'肇庆市鼎星公路监理有限公司检测中心' UNION ALL
SELECT '0000000006',N'肇庆市公路工程质量检测站' UNION ALL
SELECT '0000000096',N'肇庆市交通工程质量监督管理站'
GO
--SELECT * FROM [t1]

--> 生成测试数据表:t2

IF NOT OBJECT_ID('[t2]') IS NULL
DROP TABLE [t2]
GO
CREATE TABLE [t2]([AID] NVARCHAR(10),[corpname] NVARCHAR(20),[corptype] NVARCHAR(10))
INSERT [t2]
SELECT '0000022692',N'佛山市盛方达建设工程检测有限公司','010' UNION ALL
SELECT '0000022693',N'广东冠粤路桥有限公司中心试验室','010' UNION ALL
SELECT '0000022694',N'广东虎门技术咨询有限公司中心试验室','010' UNION ALL
SELECT '0000022695',N'广东惠州公路建设总公司中心试验室','010' UNION ALL
SELECT '0000022696',N'广东建科建筑工程质量检测中心','010' UNION ALL
SELECT '0000022697',N'广东建粤工程检测有限公司','010' UNION ALL
SELECT '0000022698',N'广东交通集团检测中心','010'
GO
--SELECT * FROM [t2]

-->SQL查询如下:
insert t2
select right('00000000'+ltrim((select MAX(aid) from t2)+ROW_NUMBER()over(Order by getdate())),10),
[Name],'010'
from (select * from t1 t where not exists(select 1 from t2 where [corpname]=t.[Name])) a

select * from t2
/*
AID corpname corptype
0000022692 佛山市盛方达建设工程检测有限公司 010
0000022693 广东冠粤路桥有限公司中心试验室 010
0000022694 广东虎门技术咨询有限公司中心试验室 010
0000022695 广东惠州公路建设总公司中心试验室 010
0000022696 广东建科建筑工程质量检测中心 010
0000022697 广东建粤工程检测有限公司 010
0000022698 广东交通集团检测中心 010
0000022699 湛江市公路工程质量监测站 010
0000022700 湛江市建筑工程质量检测站 010
0000022701 肇庆市鼎星公路监理有限公司检测中心 010
0000022702 肇庆市公路工程质量检测站 010
0000022703 肇庆市交通工程质量监督管理站 010
*/
仙道彰 2010-03-29
  • 打赏
  • 举报
回复
利用触发器实现标识列连续。(支持批量插入)
--利用触发器实现标识列连续。(支持批量插入)
-- 作者: fcuandy
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ttt]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ttt]
GO

/****** Object: Table [dbo].[ttt] Script Date: 2008-12-15 17:11:26 ******/
CREATE TABLE [dbo].[ttt] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[time] [datetime] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ttt] ADD
CONSTRAINT [PK_ttt] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO

insert into ttt(name,time) values('logan',getdate());
insert into ttt(name,time) values('peter',getdate());
insert into ttt(name,time) values('man',getdate());
insert into ttt(name,time) values('lida',getdate());
insert into ttt(name,time) values('fcuandy',getdate());

select * from ttt
/*
1 logan 2008-12-15 17:36:37.780
2 peter 2008-12-15 17:36:37.780
3 man 2008-12-15 17:36:37.780
4 lida 2008-12-15 17:36:37.780
5 fcuandy 2008-12-15 17:36:37.793
*/


GO
CREATE TRIGGER tr ON ttt
INSTEAD OF INSERT
AS
SET IDENTITY_INSERT ttt ON
DECLARE @n INT
SELECT @n=MAX(id) FROM ttt
;WITH fc AS
(
SELECT n=1
UNION ALL
SELECT nn=n+1 FROM fc WHERE n<@n
),fc1 AS
(
SELECT n FROM fc a
LEFT JOIN ttt b
ON a.n = b.id
WHERE b.id IS NULL
)
INSERT ttt(id,name,time) SELECT n,name,time
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY GETDATE()) idx,n FROM fc1) a
INNER JOIN
(
SELECT idx=ROW_NUMBER() OVER (ORDER BY GETDATE()),name,time FROM inserted
) b
ON a.idx=b.idx
DECLARE @r INT
SELECT @r=@@ROWCOUNT

SET IDENTITY_INSERT ttt OFF
INSERT ttt(name,time) SELECT name,time FROM
(
SELECT idx=ROW_NUMBER() OVER (ORDER BY GETDATE()),name,time FROM inserted
) x
WHERE idx>@r


GO
DELETE FROM ttt WHERE name = 'peter' OR name='lida'
GO
INSERT ttt SELECT 'xxx',getdate()
INSERT ttt SELECT 'yyy',GETDATE()
GO
SELECT * FROM ttt
/*
1 logan 2008-12-15 17:37:20.967
2 xxx 2008-12-15 17:37:21.013
3 man 2008-12-15 17:37:20.967
4 yyy 2008-12-15 17:37:21.030
5 fcuandy 2008-12-15 17:37:20.967
*/

DELETE FROM ttt WHERE name ='xxx' OR name='yyy'

INSERT ttt SELECT 'roy_88',GETDATE() UNION ALL SELECT 'limpire',GETDATE() UNION ALL SELECT '熊',GETDATE()

SELECT * FROM ttt

/*
1 logan 2008-12-15 17:38:29.450
2 roy_88 2008-12-15 17:38:29.530
3 man 2008-12-15 17:38:29.467
4 limpire 2008-12-15 17:38:29.530
5 fcuandy 2008-12-15 17:38:29.467
6 熊 2008-12-15 17:38:29.530
*/
仙道彰 2010-03-29
  • 打赏
  • 举报
回复
其实可以在数据库B中TableB上建立触发器,让它自动生成流水号,问题不就可以解决了
jiangshun 2010-03-29
  • 打赏
  • 举报
回复

--> 测试数据:[TA]
if object_id('[TA]') is not null drop table [TA]
create table [TA]([ID] varchar(10),[Name] varchar(34))
insert [TA]
select '0000000061','湛江市公路工程质量监测站' union all
select '0000000090','湛江市建筑工程质量检测站' union all
select '0000000093','广东建科建筑工程质量检测中心' union all
select '0000000026','肇庆市鼎星公路监理有限公司检测中心' union all
select '0000000006','肇庆市公路工程质量检测站' union all
select '0000000096','肇庆市交通工程质量监督管理站'
--> 测试数据:[TB]
if object_id('[TB]') is not null drop table [TB]
create table [TB]([AID] varchar(10),[corpname] varchar(34),[corptype] varchar(3))
insert [TB]
select '0000022692','佛山市盛方达建设工程检测有限公司','010' union all
select '0000022693','广东冠粤路桥有限公司中心试验室','010' union all
select '0000022694','广东虎门技术咨询有限公司中心试验室','010' union all
select '0000022695','广东惠州公路建设总公司中心试验室','010' union all
select '0000022696','广东建科建筑工程质量检测中心','010' union all
select '0000022697','广东建粤工程检测有限公司','010' union all
select '0000022698','广东交通集团检测中心','010'


insert into TB select [ID],[Name],'010'
from TA A where not exists(select 1 from TB where A.[Name]=[corpname])

select * from [TB]

/*
AID corpname corptype
---------- ---------------------------------- --------
0000022692 佛山市盛方达建设工程检测有限公司 010
0000022693 广东冠粤路桥有限公司中心试验室 010
0000022694 广东虎门技术咨询有限公司中心试验室 010
0000022695 广东惠州公路建设总公司中心试验室 010
0000022696 广东建科建筑工程质量检测中心 010
0000022697 广东建粤工程检测有限公司 010
0000022698 广东交通集团检测中心 010
0000000061 湛江市公路工程质量监测站 010
0000000090 湛江市建筑工程质量检测站 010
0000000026 肇庆市鼎星公路监理有限公司检测中心 010
0000000006 肇庆市公路工程质量检测站 010
0000000096 肇庆市交通工程质量监督管理站 010

(12 行受影响)

*/
drop table TB,TA
htl258_Tony 2010-03-29
  • 打赏
  • 举报
回复
数据库B中TableB的AID是否为自增列?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧