数据库新手求助,关于存储过程

桃花源土著 2003-12-12 04:29:25
我要从一个表A中得到他的总的记录数,然后将这些记录插入到另一个表B中,表B相对于表A而言多了两个字段,其中一个为记录序号的,怎么把表A中的记录插入到表B中,同时插入流水号?
...全文
21 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
桃花源土著 2003-12-13
楼上的,我是要让存储过程中自动新增记录而不是手工插入呀

怎么得到A表中的记录数,然后循环插入呢?
  • 打赏
  • 举报
回复
txlicenhe 2003-12-12
写一个函数得到A的最大值,在B的该字段默认值中填入该函数。
eg:

问题:在实际业务处理中有些单号需要自动增长,但又不能用自增列代替
eg: P031106001 -- 第一位P表示采购单,031106表示日期,后三位是流水号。 

/* 1:创建测试用的表结构 */
create table tablename(pono char(10),b int)
go
/* 2:创建一个得到当前日期的视图,为下面的自字义函数作准备 */
create view vGetdate
as
select getdate() as today
go
/* 3:用自定义函数来得到单号(因自定函数内不能用getdate()来得到当前日期,要用到上面的视图) */
create function getDH()
returns char(10)
As
begin
declare @dh1 char(10),@dh2 char(10)
select @dh1 = max(pono) from tableName
Set @dh1 = IsNull(@dh1,'P000000000')
select @dh2 = Left(@dh1,1) + right(convert(varchar(8),today,112),6) + '001' from vGetdate
if @dh1 >= @dh2
begin
set @dh2 = left(@dh1,7) + right('000'+ cast(cast(right(@dh1,3) as int)+1 as varchar),3)
end
return(@dh2)
end
go
/* 4:在字段默认值中填入 dbo.getdh() */
alter table tablename add constraint df_tablename_1 default(dbo.getdh()) for pono
-/* 5:测试:*/
insert tablename(b) values(1)
insert tablename(b) values(2)
Select * from tablename
-- 测试结果
pono b
---------- -----------
P031115001 1
P031115002 2
总结:此方法运用到了一些小技巧
1:用字段默认值来实现单号自增
2:用自定义函数来得到字段的默认值
3:因在自定义函数中不能用getdate()之类非确定的函数,用视图来得到当前日期
  • 打赏
  • 举报
回复
vileboy 2003-12-12
不才,找到了些简单的错误,不知道找对了吗:
CREATE PROCEDURE Evlsp_MoveData
@TbName varchar(200),
@ReturnValue int output
as
set @ReturnValue=0
declare @temp varchar(200)
declare @doccount int
declare @maxNumber int,@i int,@j int
if not exists(select Doc_Dbpath from Evl_FlowNumber where Doc_Dbpath=@Tbname)
begin
--声明并打开一个scroll游标
DECLARE moveCur Scroll cursor
for
select * from @tbname
open moveCur
--显示游标集合中数据行数
set @i=@@cursor_Rows

--读取游标中的延第一行数据
/****************************
declare @DocFlowNumber bigint
原来的:DECALRE @DocFlowNumber bigint
********************************/
DECLARE @Nsf varchar(100),@DocID char(32),@DocCategory varchar(200)
DECLARE @subject varchar(200),@Click smallint,@Reader varchar(20),@ReadDate datetime
DECLARE @CreateTime datetime,@Creator varchar(4000),@Parameter varchar(200)
for @j=1 to @i
begin
Fetch absolute @j FROM moveCur INTO @DocID,@TbName,@DocFlownumber,@DocCategory,@Subtemp,@temp,@creator,@subject,@Reader,@ReadDate

SELECT TOP 1 @maxNumber=Doc_FlowNumber from Evl_FlowNumber order by Doc_FlowNumber desc
if @maxNumber<>"" then
begin

insert into Evl_Flownumber (Doc_ID,Doc_Dbpath,Doc_FlowNumber,Doc_Category,Doc_Click,Doc_CreateTime,Doc_Creator,Doc_Subject,Doc_RecentReaders,Doc_ReadDate)
values(@DocID,@TbName,@DocFlownumber,@DocCategory,@Subtemp,@temp,@creator,@subject,@Reader,convert(varchar(18),@ReadDate)/****这里少了个括号****/
end
else
/********************************改了这里*****************
set @DocFlowNumber=datepart(yy,@createtime)+'000001'
原来的:@DocFlowNumber=datepart(yy,@createtime)+'000001'
*****×××××××*****改了这里*******************************/
insert into Evl_Flownumber (Doc_ID,Doc_Dbpath,Doc_FlowNumber,Doc_Category,Doc_Click,Doc_CreateTime,Doc_Creator,Doc_Subject,Doc_RecentReaders,Doc_ReadDate)
values(@DocID,@TbName,@DocFlownumber,@DocCategory,@Subtemp,@temp,@creator,@subject,@Reader,convert(varchar(18),@ReadDate)/****这里少了个括号****/
end
set @ReturnValue=1
GO
  • 打赏
  • 举报
回复
vileboy 2003-12-12
DECALRE @DocFlowNumber bigint 改为 declare
Doc_FlowNumber里面有字母吗?
  • 打赏
  • 举报
回复
vileboy 2003-12-12
你可以试着把你的产生编码的功能用一个函数产生,然后让产生的编码和a表中的记录联结,再插入到b表中。
  • 打赏
  • 举报
回复
桃花源土著 2003-12-12
我可能没有说明白,我在B中是个空表,但是我要将A中的记录转移到B中,B表的设计相对于A多了两个字段,且其中的一个字段为编号,这个编号要依照一定的原则,所以不能用自增字段,有人说要涉及到游标,可我确实不懂,哪位能给出实际的例子?
CREATE PROCEDURE Evlsp_MoveData @TbName varchar(200),@ReturnValue int output
as
set @ReturnValue=0
declare @temp varchar(200)
declare @doccount int
declare @maxNumber int,@i int,@j int
if not exists(select Doc_Dbpath from Evl_FlowNumber where Doc_Dbpath=@Tbname)
begin
--声明并打开一个scroll游标
DECLARE moveCur Scroll cursor
for
select * from @tbname
open moveCur
--显示游标集合中数据行数
set @i=@@cursor_Rows

--读取游标中的延第一行数据
DECALRE @DocFlowNumber bigint
DECLARE @Nsf varchar(100),@DocID char(32),@DocCategory varchar(200)
DECLARE @subject varchar(200),@Click smallint,@Reader varchar(20),@ReadDate datetime
DECLARE @CreateTime datetime,@Creator varchar(4000),@Parameter varchar(200)

for @j=1 to @i
begin
Fetch absolute @j FROM moveCur INTO @DocID,@TbName,@DocFlownumber,@DocCategory,@Subtemp,@temp,@creator,@subject,@Reader,@ReadDate

SELECT TOP 1 @maxNumber=Doc_FlowNumber from Evl_FlowNumber order by Doc_FlowNumber desc
if @maxNumber<>"" then
begin
@DocFlowNumber=@maxNumber+1
insert into Evl_Flownumber (Doc_ID,Doc_Dbpath,Doc_FlowNumber,Doc_Category,Doc_Click,Doc_CreateTime,Doc_Creator,Doc_Subject,Doc_RecentReaders,Doc_ReadDate) values(@DocID,@TbName,@DocFlownumber,@DocCategory,@Subtemp,@temp,@creator,@subject,@Reader,convert(varchar(18),@ReadDate)
end
else
@DocFlowNumber=datepart(yy,@createtime)+'000001'
insert into Evl_Flownumber (Doc_ID,Doc_Dbpath,Doc_FlowNumber,Doc_Category,Doc_Click,Doc_CreateTime,Doc_Creator,Doc_Subject,Doc_RecentReaders,Doc_ReadDate) values(@DocID,@TbName,@DocFlownumber,@DocCategory,@Subtemp,@temp,@creator,@subject,@Reader,convert(varchar(18),@ReadDate)
end
set @ReturnValue=1
GO
我试写了一下,有很多错误,哪位能帮忙调试一下?
  • 打赏
  • 举报
回复
zjcxc 2003-12-12
将B表的序号设置为标识字段就行了.
  • 打赏
  • 举报
回复
victorycyz 2003-12-12
B表中只要建一个自增字段就行了。

得到记录总数:select count(*) as 记录数 from A
插入数据: insert into B (除自增字段外的字段列表) select * from A
  • 打赏
  • 举报
回复
sdhdy 2003-12-12
insert b(流水号,记录数)
select max(流水号)+1,(select count(*) from a) from b
  • 打赏
  • 举报
回复
发帖
疑难问题
加入

2.1w+

社区成员

MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
申请成为版主
帖子事件
创建了帖子
2003-12-12 04:29
社区公告
暂无公告