关于自增字段的问题(100分)

  • 主题发起人 主题发起人 fstao
  • 开始时间 开始时间
F

fstao

Unregistered / Unconfirmed
GUEST, unregistred user!
后台为sql server 7,
假如dbo.table1的字段id为自增字段(主关键字),name为Char(10)字段,假如dbo.table2的
数据为100条,用sql语句:insert into dbo.table1(name) select field2 from table2,
那么dbo.table1的id为自动增加数字。如果把dbo.table1的id改为char(10),去掉自增字段
,但保留主关键字,还是用上面语句,希望得到dbo.table1的数据:
id name
A1 ..
A2 ..
A3 ..
.. ..
A100 ..

如何做?我希望不要用delphi来编程,纯粹用sql语句来写,如何做?
 
先用自增字段,改为char,在和A合并
 
真是奇怪的要求,应该做不到。
 
SELECT ID='A'+ID FROM Table1
 
补充:如果每次只插一条,可用一般SQL解决。
插多条用CURSOR解决。存储过程是很好的选择。
 
先在库中建一字段如(IDA)为自动增加字段。
在用SELECT ID='A'+CAST(IDS AS VARCHAR(10) ...
 
Table2的结构,如果和TABLE1结构一样应该是很简单的问题了!
 
To fstao:
一次 Insert 估计是没有可能,写 SP 吧。
 
完全可以,我刚做完一个循环取数据并插入的SQL脚本! :)
要用到光标,全部用SQL脚本语句!满意的话别忘给分

DECLARE @id varchar(10),@name varchar(10),@ls_temp varchar(10)
DECLARE @li_loop integer

select @ls_temp='A'
declare cu_id cursor for
select field2 from table2
open cu_id
while(1=1)
begin
fetch cu_id into @name
//假如cursor出错就中断
if @@fetch_status <> 0
break

select @li_loop=1
while @li_loop<=100
begin
select @id=@ls_temp+str(@li_loop)
insert into table1 values(@id,@name)
select @li_loop=@li_loop+1
end
end
deallocate cu_id


 
让我试一试。
 
to lipingcool:
出错:
Insert Error: Column name or number of supplied values does not match table
definition.

还有另一个问题,假如你的语句没有错的,第一次运行insert into table1时,没有问题,
但是第二次再运行我想可能会出错,因为我在table1的id为主键,是不能重复的。如果
table1的id是自增字段,这样我不管table2有多少条数据,insert into dbo.table1(name)
select field2 from table2,table1的id是永远不会重复的,而你给的是定死在100条数据,
我想第一次运行没有问题的,但第二开始肯定有问题。
 
我知道你的意思,等我有空给你再写一段,看合不合你意! :)
 
我试过了,用下面这段代码能够实现你想要的功能! :)
注:我假设你从table2中返回的是一个数据集而不是单条的记录,所以用到了cursor,
若你肯定每次返回的是单条记录的话,不要cursor部分也行!

DECLARE @id varchar(10),@name varchar(10),@ls_temp varchar(10),@next_id int

select @ls_temp='A'
declare cu_id cursor for
select field2 from table2
open cu_id
while(1=1)
begin
fetch cu_id into @name
--假如cursor出错就中断
if @@fetch_status <> 0
break

--取得最大的ID号并加1做为将要插入的新记录的ID号
--这样的话,就能保证ID字段是自增的,比如现在表中最大的ID是A23,则得出的是24
select @next_id=max(convert(int,substring(id,2,(datalength(id)-1))))+1
from table1
select @id=@ls_temp+str(@next_id)
//将新记录插入表table1
insert into table1 values(@next_id,@name)
end
deallocate cu_id
 
to lipingcool:
但为何在insert into table1 values(@next_id,@name) 里出现错误:
Insert Error: Column name or number of supplied values does not match table
definition.
 
删除全部记录时,自增字段可不可重计为 1?怎样做?
 
to fstao:
不好意思,改了几个小BUG,我专门建了两个表来做测试,语句执行正常,请注意我加**的语句
为改动或新加的!
另外,我建议你把ID,NAME等字段的数据类型改为varchar,负责的话要将返回的字段值用函数
去掉后面的空格
假如还有什么问题的话,直接mail我也行:lipingcool@263.net

DECLARE @id varchar(10),@name varchar(10),@ls_temp varchar(10),@next_id int

select @ls_temp='A'
declare cu_id cursor for
select field2 from table2
open cu_id
while(1=1)
begin
fetch cu_id into @name
--假如cursor出错就中断
if @@fetch_status <> 0
break

--取得最大的ID号并加1做为将要插入的新记录的ID号
--这样的话,就能保证ID字段是自增的,比如现在表中最大的ID是A23,则得出的是24
select @next_id=max(convert(int,substring(id,2,(datalength(id)-1))))+1
from table1
** --假如表table1中没有记录,则让ID号从1开始
** if @next_id is null
** begin
** select @next_id=1
** end

** select @id=@ls_temp+ltrim(rtrim(str(@next_id)))
--将新记录插入表table1
** insert into table1 values(@id,@name)
end
deallocate cu_id

to lam:
告诉你一个绝招吧,用下面的语句!
truncate table you_table_name
注:该语句会清空表中的数据,但可以使 identity的值回复1
 
接受答案了.
 
后退
顶部