set @str=@can while charindex(',',@str)>0 ->改为 while @@rowcount>0改后执行就一直停在那里,好像有错?还有我是按照逗号进行分割的,是不是还有其他办法呢?
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 行受影响)*/
这个是按照你的思路 不用函数也可以写出来的 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
谢谢feixianxxx,可是为什么最后会多循环一次? 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 exec releaseVote '','aaaaaa','','王老吉,水溶C100,果粒橙','多选' /* id topic content ------------------------------- 1 aaaaaa(1 行受影响)id vid cand option ------------------------------------ 1 1 王老吉 多选 2 1 水溶C100 多选 3 1 果粒橙 多选 4 1 果粒橙 多选(4 行受影响) */为什么会有四行?难道是多循环了一次?能否再帮忙看看,问题解决了我会结贴的,谢谢!!
drop table vote,voteDetail gocreate 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,@str,@option)--这里修改了下 可以了 去试试if(@@error > 0) rollback else commit go exec releaseVote '','aaaaaa','','王老吉,水溶C100,果粒橙','多选' go select id ,topic, content from vote select * from voteDetail
while charindex(',',@str)>0
->改为
while @@rowcount>0改后执行就一直停在那里,好像有错?还有我是按照逗号进行分割的,是不是还有其他办法呢?
(
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 行受影响)*/
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
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 exec releaseVote '','aaaaaa','','王老吉,水溶C100,果粒橙','多选' /*
id topic content
-------------------------------
1 aaaaaa(1 行受影响)id vid cand option
------------------------------------
1 1 王老吉 多选
2 1 水溶C100 多选
3 1 果粒橙 多选
4 1 果粒橙 多选(4 行受影响)
*/为什么会有四行?难道是多循环了一次?能否再帮忙看看,问题解决了我会结贴的,谢谢!!
gocreate 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,@str,@option)--这里修改了下 可以了 去试试if(@@error > 0)
rollback
else
commit go
exec releaseVote '','aaaaaa','','王老吉,水溶C100,果粒橙','多选'
go
select id ,topic, content from vote
select * from voteDetail
{
conn.Open();
SqlCommand comm = new SqlCommand("releaseVote", conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("@uid", SqlDbType.Int);
comm.Parameters["@uid"].Value = DBNull.Value;
comm.Parameters.Add("@topic", SqlDbType.VarChar);
comm.Parameters["@topic"].Value = txtTopic.Text;
comm.Parameters.Add("@content", SqlDbType.VarChar);
comm.Parameters["@content"].Value = txtContent.Text;
comm.Parameters.Add("@cand", SqlDbType.VarChar);
comm.Parameters["@cand"].Value = txtCand1.Text + "," + txtCand2.Text + "," + txtCand3.Text + "," + txtCand4.Text + "," + txtCand5.Text + "," + txtCand6.Text + "," + txtCand7.Text + "," + txtCand8.Text + "," + txtCand9.Text + "," + txtCand10.Text + "," + txtCand11.Text + "," + txtCand12.Text + "," + txtCand13.Text + "," + txtCand14.Text + "," + txtCand15.Text + "," + txtCand16.Text + "," + txtCand17.Text;
comm.Parameters.Add("@option", SqlDbType.VarChar);
comm.Parameters["@option"].Value = dropOption.SelectedValue;
comm.ExecuteNonQuery();现在的问题是用户用可能不会输入那么多选项,有可能只输入5,6个,那剩下的几个空白框中的内容也会往表里插空白记录,如果不想要这些空白记录怎么办??
比如:我插了3个测试数据,结果表中结构是这样:
id vid cand option
-------------------------------------
1 1 王老吉 多选
2 1 水溶C100 多选
3 1 果粒橙 多选
4 1 多选
5 1 多选
6 1 多选
7 1 多选
8 1 多选
9 1 多选
10 1 多选
11 1 多选
12 1 多选
13 1 多选
14 1 多选
15 1 多选
16 1 多选
17 1 多选那我那剩下的14条多余记录不要怎么办??是不是代码写错了??