问题是这样的:
     服务器端接收到客户端发来的字符串,字符串的内容是这样的: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.   

    用split函数是最快的方式,在服务器里切割,只会给服务器增加负荷。如果有大量的客户端同时访问,服务器承受的更多
      

  2.   

    如果题目有n个 就得交互n此
    这句话你说错了,有n个,你拼为insert字符串,执行一次就可以了,确保数据完整,要加事务。
      

  3.   

    CREATE TABLE TB(questionID NVARCHAR(10),answer NVARCHAR(100))declare @answer nvarchar(300);
    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
      

  4.   

    split函数不也是在服务器端做的吗?相对于t-sql的循环来说,不是应该t-sql更快吗?
    拼凑insert 倒是一个不错的注意!谢谢你!!!
      

  5.   

    if object_id('f_split')is not null drop function  f_split
    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 個資料列受到影響)
    */