如何在存储过程中循环插入记录?

angel_zxq 2009-07-12 10:29:01
我想实现一个投票的功能,写了一个存储过程,用来记录下投票的内容。先说一下我的表:
vote--投票表:
id int identity(1,1) primary key not null,--投票编号
uid int null,--用户编号(跟用户表的用户id联系)
topic varchar(100) not null,--投票主题
content text null,--投票详细说明
date datetime default(getdate())not null,--投票发起日期
todate datetime null,--投票截止日期
vconfine varchar(30) null,--投票限制
lconfine varchar(30) null--点评限制
cont int null--投票人数
voteDetail--投票详情表:
id int identity(1,1) primary key not null,--编号
vid int null,--投票编号(跟投票表中的id联系)
cand varchar(500) null,--投票选项
[option] varchar(30) null--投票形式
存储过程:
create proc releaseVote--发布投票
(
@uid int,
@topic varchar(100),
@content text,
@cand varchar(500),
@option varchar(30)
)
as
declare @vid int ,/*投票编号*/ @len int,@i int ,/*循环变量*/ @str varchar(100) ,/*用来分割的变量*/ @id varchar(30)--测试数据
begin tran
insert into vote(uid,topic,content) values(@uid,@topic,@content)
select @vid = max(id) from vote
--这里准备根据页面中有多少文本框而循环插入??
set @str=@can
while charindex(',',@str)>0
begin
select @vid = max(id) from vote
set @str = left(@str,charindex(',',@str)-1)
insert into voteDetail(vid,cand,[option]) values(@vid,@str,@option)
set @str = stuff(@str,1,charindex(',',@str),'')
end
if(@@error > 0)
rollback
commit

exec releaseVote '','aaaaaa','','王老吉,水溶C100,果粒橙,','多选'

实现的结果:
投票表:
id topic content
-----------------------------
1 aaaaaa
投票详情表:
id vid cand option
-----------------------------------
1 1 王老吉 多选

我希望实现的结果:
投票表:
id topic content
-----------------------------
1 aaaaaa
投票详情表:
id vid cand option
-----------------------------------
1 1 王老吉 多选
2 1 水溶C100 多选
3 1 果粒橙 多选

想实现该结果存储过程应该怎么改?现在的问题就是执行该存储过程好像不能循环了,只能插入一条记录了,是不是循环部分有问题?该怎么改?哪位高手能指点下,谢谢!!
...全文
82 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
feixianxxx 2009-07-13
  • 打赏
  • 举报
回复
create table vote
(
id int identity(1,1) primary key not null,--投票编号
[uid] int null,--用户编号(跟用户表的用户id联系)
topic varchar(100) not null,--投票主题
content text null,--投票详细说明
[date] datetime default(getdate())not null,--投票发起日期
todate datetime null,--投票截止日期
vconfine varchar(30) null,--投票限制
lconfine varchar(30) null,--点评限制
cont int --投票人数
)
go
create table voteDetail--投票详情表:
(
id int identity(1,1) primary key not null,--编号
vid int null,--投票编号(跟投票表中的id联系)
cand varchar(500) null,--投票选项
[option] varchar(30) null--投票形式
)

go
--建个拆分字符串的函数
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
INSERT @re VALUES(@s)
RETURN
END
GO
alter proc releaseVote--发布投票
(
@uid int,
@topic varchar(100),
@content text,
@cand varchar(500),
@option varchar(30)
)
as
begin
declare @vid int ,/*投票编号*/ @str varchar(100) ,/*用来分割的变量*/ @id varchar(30)--测试数据

insert into vote(uid,topic,content) values(@uid,@topic,@content)
select @vid = max(id) from vote
insert into voteDetail(vid,cand,[option])
select @vid,*,@option
from dbo.f_splitSTR(@cand,',')--调用函数
end
go
exec releaseVote '','aaaaaa','','王老吉,水溶C100,果粒橙','多选'

select id,topic,content from vote
select id ,vid ,cand from voteDetail
/*
id topic content
----------- -----------------------------------------------------------
1 aaaaaa

(1 行受影响)

id vid cand
----------- ----------- -----------------------
1 1 王老吉
2 1 水溶C100
3 1 果粒橙

(3 行受影响)*/
feixianxxx 2009-07-13
  • 打赏
  • 举报
回复
个是按照你的思路 不用函数也可以写出来的
drop table vote,voteDetail
go
create table vote
(
id int identity(1,1) primary key not null,--投票编号
[uid] int null,--用户编号(跟用户表的用户id联系)
topic varchar(100) not null,--投票主题
content text null,--投票详细说明
[date] datetime default(getdate())not null,--投票发起日期
todate datetime null,--投票截止日期
vconfine varchar(30) null,--投票限制
lconfine varchar(30) null,--点评限制
cont int --投票人数
)
go
create table voteDetail--投票详情表:
(
id int identity(1,1) primary key not null,--编号
vid int null,--投票编号(跟投票表中的id联系)
cand varchar(500) null,--投票选项
[option] varchar(30) null--投票形式
)

go
alter proc releaseVote--发布投票
(
@uid int,
@topic varchar(100),
@content text,
@cand varchar(500),
@option varchar(30)
)
as
declare @vid int , @str varchar(100) ,@s varchar(100)
begin tran
insert into vote(uid,topic,content) values(@uid,@topic,@content)
select @vid = max(id) from vote
set @str=@cand
while charindex(',',@str)>0
begin
set @s=(LEFT(@str,CHARINDEX(',',@str)-1))
insert into voteDetail(vid,cand,[option])
values(@vid,@s,@option)
SET @str=STUFF(@str,1,CHARINDEX(',',@str),'')
end
insert into voteDetail(vid,cand,[option])
values(@vid,@s,@option)
if(@@error > 0)
rollback
else
commit

go
exec releaseVote '','aaaaaa','','王老吉,水溶C100,果粒橙','多选'
go
select id ,topic, content from vote
select * from voteDetail
suibianbuliao 2009-07-12
  • 打赏
  • 举报
回复
lu guo
feixianxxx 2009-07-12
  • 打赏
  • 举报
回复
你想写个存储过程实现功能?
--小F-- 2009-07-12
  • 打赏
  • 举报
回复
发重复了 会被删除的

34,872

社区成员

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

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