高分求教:向大家请教一个关于复制数据的问题

idot 2006-06-19 06:47:57
最近在下接手一个项目,涉及到这样一个问题:数据库中有一个表Examine,共有三个字段:xh、name、remark,其中字段 xh 是主键,有 Identity 属性,自动增长,从1开始,增量为1,客户提供这样如下数据(是一个文本文件—— c:\examineData.txt):
xh|name|remark
1|未年检|
2|年检基本合格|
3|年检合格|
4|年检不合格|
5|未知|
......
要求我们把它原封不动地导入到表Examine中,但是我在导入过程中受挫,问题在于字段 xh 是Identity的,如果之前有数据,导入后会与文本文件中的不一致。请问大家如何编写 SQL 语句(不必是单条的,也可以是成批的),使得导入的数据与文本文件中的一致。
...全文
253 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
十一月猪 2006-06-22
  • 打赏
  • 举报
回复
not for repliaction 学习
铁歌 2006-06-20
  • 打赏
  • 举报
回复
CREATE TABLE [dbo].[Examine] (
[xh] [int] IDENTITY (1, 1) NOT NULL not for repliaction,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[remark] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
把主键改成not for 复制类型的即可
十一月猪 2006-06-20
  • 打赏
  • 举报
回复
这里的insert 用bulk insert
好象 set identity_insert on 好象没有效果
idot 2006-06-19
  • 打赏
  • 举报
回复
laoliu666(雨一直在下):如何把种子去掉,又如何把种子埋上?
LouisXIV 2006-06-19
  • 打赏
  • 举报
回复
哪有那么复杂^^;

SET IDENTITY_INSERT Examine ON

指定字段名插入(必须指定)

插入完
SET IDENTITY_INSERT Examine OFF
就搞定了,例文在上面写着
bambuz 2006-06-19
  • 打赏
  • 举报
回复
我的建议:
1 将examineData.txt 导入到 sql server 中。
2 更新表 examine 中到资料:
update examine set name=b.name,remark=b.remark
from examine a left join examineData b on a.xh=b.xh
LouisXIV 2006-06-19
  • 打赏
  • 举报
回复
fcuandy(电脑杂工)

那个人不是LZ^^;
fcuandy 2006-06-19
  • 打赏
  • 举报
回复
这个要求好像是说你可以肆意修改原表数据了?

如果不改原表数据,怎么可能保证导入后的数据ID能与文本文件一致?

即然可以肆意修改,干脆把原表数据清了吧

TRUNCATE TABLE 你的表
然后导入. HAHA
LouisXIV 2006-06-19
  • 打赏
  • 举报
回复
if exists(select 1 from sysobjects where id=object_id('Examine')and xtype='U') drop table Examine
CREATE TABLE [dbo].[Examine] (
[xh] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[remark] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
SET IDENTITY_INSERT Examine ON
go
insert into Examine
(
xh,name,remark
)
select 1,'A','B' union all
select 2,'B','C' union all
select 5,'D','E'
go
select * from examine
go
SET IDENTITY_INSERT Examine off
go
insert into Examine
select 'E','G'
go
select * from examine
go
drop table Examine
go
/*
xh name remark
----------- -------------------------------------------------- ----------------------------------------
1 A B
2 B C
5 D E


xh name remark
----------- -------------------------------------------------- ----------------------------------------
1 A B
2 B C
5 D E
6 E G

*/
laoliu666 2006-06-19
  • 打赏
  • 举报
回复
这样表想怎么修改都可以,不用语句。
laoliu666 2006-06-19
  • 打赏
  • 举报
回复
,问题在于字段 xh 是Identity ?先把种子去掉,导如数据后再重新埋上
fcuandy 2006-06-19
  • 打赏
  • 举报
回复
看错题目要求了...
LouisXIV 2006-06-19
  • 打赏
  • 举报
回复
用SET IDENTITY_INSERT就可以了
fcuandy 2006-06-19
  • 打赏
  • 举报
回复
1,其实你可以导入到新表, 然后用

INSERT SELECT 从新表再将数据追加到你的目标表.

2,或者在sql中调用com组件,用FSO按行读取再写表.这样就麻烦了.

3,用外部程序实现导入. 用c#,c++之类的高级语言来操作文本,再写库,应该是很简单的.
fcuandy 2006-06-19
  • 打赏
  • 举报
回复
这个文本文件多少K?
idot 2006-06-19
  • 打赏
  • 举报
回复
补充:
下面是表 Examine 的创建脚本,供大家参考。

CREATE TABLE [dbo].[Examine] (
[xh] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[remark] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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