其实你的效率低的原因不是用SQL语句还是存储过程的问题。看你的描述以及代码,如果是多次循环上述代码的话,确实效率会比较低,原因是有一次循环就会和数据库产生一次查询和更新通讯,希望增加效率应该从尽量减少和数据库通讯方面来考虑解决,因为是这里出现了效率瓶颈。
下面是具体的代码分析:
首先更新和插入操作是无法减少的,必须一条纪录一条纪录更新,一条纪录一条纪录的插入,但是查询完全可减低为一次查询。
下面是伪代码:
strsql="select * from "&tabl&" where id+idd in ('所有要循环的id+idd,他们之间用逗号分开')"
rs.open strsql,conn,3,3
do while not rs.eof
rs("degree")=rs("degree")+1
tempstr=tempstr&id&idd&"|" '这里是将数据库中存在的id,idd记录保存下来,存入一个临时变量中,用|符号分割开。
rs.update
rs.movenext
loop
'上面的代码是更新了数据库中存在的纪录,并记录下了存在的记录ID+IDD
下面将所有存在的已update的id+idd的值从所有的id+idd的值中剔除掉,取到所有需要insert的id+idd纪录,然后一起insert进数据库即可。代码我不再写了,这样的字符串对比操作并不难,因为这样都是内存操作,速度会很快。仅提供一个思路。希望对你有用。
如果不用command方式的话,就只有优化这段代码了
strsql="select * from "&tabl&" where id='"&id&"' and idd='"&idd&"'"
rs.open strsql,conn,3,3 '这里改成1,1方式打开
if not rs.eof then
rs("degree")=rs("degree")+1 '不知道你的RS已经EOF了为什么还要对他操作,完全可以跳过,如果需要,这里直接使用CONN.execute(update语句)
rs.update
else
rs.addnew '这里换成conn.execute(insert)语句
rs("degree")=1
rs("idd")=idd
rs("id")=id
rs.update
end if
你可以在循环前加上StarTime=Timer()
循环后面加
EndTime=Timer()
response.WriteFormatNumber(EndTime-StarTime)*1000,0)
看看具体时间能提高多少
没有用循环,那是确定只有一条记录了,这样的话,用不用SQL都差不多,效率上差距不大,如果是多条的话,最好还是用SQL做比较好。
如果再多的话,可以用存储过程来做
CREATE PROCEDURE UpdateTable(@TableName VARCHAR(50),
@ID VARCHAR(15), @IDD VARCHAR(15)) AS
DECLARE @TempID VARCHAR(15), @SQLCommand VARCHAR(2000)
BEGIN
SET @SQLCommand = 'SELECT @TempID = [ID] FROM ' + @TableName + 'WHERE [ID] = ''' + @ID + ''' AND IDD = ''' + @IDD + ''''
EXEC sp_executesql @SQLCommand, N'@TempID CHAR(15) out', @TempID out
IF @TempID IS NULL
SET @SQLCommand = 'INSERT INTO ' + @TableName + '(degree, idd, [id]) VALUES (1,''' + @IDD+ ''', ''' + @ID + ''')'
ELSE
SET @SQLCommand = 'UPDATE ' + @TableName + ' SET degree = degree + 1'
EXEC sp_executesql @SQLCommand
END
GO
不知道这样的存储过程对不对头
用Command对象具体怎么用你可以到网上查查(不建议找人写
代码因为与其把时间放在看别人代码上不如放在看原理和自己实践
上)
最好用循环,会好点.