问题是这样的:
服务器端接收到客户端发来的字符串,字符串的内容是这样的:1★答案☆2★答案☆3★答案....,这是一张试卷的答案,其中“☆”用来分隔题目,“★”用来分隔题号和答案。
以前是通过一个C#的split函数先分割到一个数组中,然后循环插入数据库,如果题目有n个 就得交互n此。很消耗资源 现在我用存储过程处理,直接将字符床传到存储过程:实例代码如下:
//方便大家直接运行,下面只是给出了存储过程的核心部分模拟declare @answer nvarchar(300);
declare @index int;
declare @questionID nvarchar(100);
declare @questionAnswer nvarchar(100);
declare @subindex int;
declare @subanswer nvarchar(100);
select @answer='1★答案1☆2★答案2☆3★答案3☆';
select @answer;
select @index=charindex('☆',@answer);
while Len(@answer)!=0
begin
select @subanswer=LEFT(@answer,@index-1)
select @subanswer;select @subindex=CHARINDEX('★',@subanswer);
select @questionID=left(@subanswer,@subindex-1);
select @questionAnswer=RIGHT(@subanswer,len(@subanswer)-@subindex);
select @questionAnswer,@questionID;
/*****************************************************/
/*插入数据库的代码省去*/
/********************************************************/select @answer=SUBSTRING(@answer,@index+1,LEN(@answer)-@index);
select @answer;
end
因为这块在整个系统中会频繁调用,因此对效率要求很高!
请各位大牛小牛给我提提意见,看看还有什么地方可以优化的! 拜谢。
服务器端接收到客户端发来的字符串,字符串的内容是这样的:1★答案☆2★答案☆3★答案....,这是一张试卷的答案,其中“☆”用来分隔题目,“★”用来分隔题号和答案。
以前是通过一个C#的split函数先分割到一个数组中,然后循环插入数据库,如果题目有n个 就得交互n此。很消耗资源 现在我用存储过程处理,直接将字符床传到存储过程:实例代码如下:
//方便大家直接运行,下面只是给出了存储过程的核心部分模拟declare @answer nvarchar(300);
declare @index int;
declare @questionID nvarchar(100);
declare @questionAnswer nvarchar(100);
declare @subindex int;
declare @subanswer nvarchar(100);
select @answer='1★答案1☆2★答案2☆3★答案3☆';
select @answer;
select @index=charindex('☆',@answer);
while Len(@answer)!=0
begin
select @subanswer=LEFT(@answer,@index-1)
select @subanswer;select @subindex=CHARINDEX('★',@subanswer);
select @questionID=left(@subanswer,@subindex-1);
select @questionAnswer=RIGHT(@subanswer,len(@subanswer)-@subindex);
select @questionAnswer,@questionID;
/*****************************************************/
/*插入数据库的代码省去*/
/********************************************************/select @answer=SUBSTRING(@answer,@index+1,LEN(@answer)-@index);
select @answer;
end
因为这块在整个系统中会频繁调用,因此对效率要求很高!
请各位大牛小牛给我提提意见,看看还有什么地方可以优化的! 拜谢。
这句话你说错了,有n个,你拼为insert字符串,执行一次就可以了,确保数据完整,要加事务。
select @answer='1★答案1☆2★答案2☆3★答案3☆';DECLARE @SQL NVARCHAR(MAX)SET @SQL = REPLACE (REPLACE (@answer,'★',''','''),'☆',''' UNION ALL SELECT ''')SET @SQL = 'INSERT TB(questionID,answer) SELECT ''' + LEFT(@SQL,LEN(@SQL)-19)
EXEC(@SQL)SELECT * FROM TB--结果
questionID answer
1 答案1
2 答案2
3 答案3
拼凑insert 倒是一个不错的注意!谢谢你!!!
go
create function f_split
(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)returns table
as
return
(
select substring(@s,number,charindex(@split,@s+@split,number)-number)as col
from master..spt_values
where type='p' and number<=len(@s+'a')
and charindex(@split,@split+@s,number)=number
)
go
select * from dbo.f_split('11,2,3',',')
/*
col
----
11
2
3
(3 個資料列受到影響)
*/