读书人

sql话语求优化,合并两条select语句

发布时间: 2013-04-02 12:35:26 作者: rapoo

sql语句求优化,合并两条select语句, 小弟感激不尽



USE [QQData]
GO
/****** Object: StoredProcedure [dbo].[CreateTigger] Script Date: 03/28/2013 18:31:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CreateTigger]
AS
BEGIN
declare @sql varchar(4000);
declare @begin int=10000;
while(@begin<=99999)
begin
set @sql='create TRIGGER [dbo].[tgr_Tab_'+CONVERT(varchar(10),@begin)+'_Insert]
ON [dbo].[Tab_'+CONVERT(varchar(10),@begin)+']
for INSERT
AS
BEGIN
SET NOCOUNT ON;
declare @RepeatCount int=0;
declare @Id int;
declare @QQNumber bigint;
declare @QQPassword varchar(1000);
declare cur_insert cursor for select Id,QQNumber,QQPassword from inserted; /*声明游标并指明游标操作的对象*/
open cur_insert; /*打开游标*/
fetch next from cur_insert into @Id,@QQNumber,@QQPassword /*读取下一行*/
while @@fetch_status=0
begin
select top 1 @RepeatCount=count(QQNumber) from Tab_'+CONVERT(varchar(5),@begin)+' where QQNumber=@QQNumber; /*判断重复*/
if(@RepeatCount>1)
begin
/*更新*/
set @QQPassword=''∝''+@QQPassword;
update Tab_'+CONVERT(varchar(5),@begin)+' set QQPassword=QQPassword+@QQPassword where QQNumber=@QQNumber and Id<>@Id;
/*删除*/
delete from Tab_'+CONVERT(varchar(5),@begin)+' where Id=@Id;
end
fetch next from cur_insert into @Id,@QQNumber,@QQPassword; /*读取下一行*/
end
/*关闭游标*/
close cur_insert;
deallocate cur_insert;
end';
print @begin;
exec(@sql);
set @begin=@begin+1;
end
END


逻辑是这样的, 批量插入表之后, 再用游标循环Inserted的结果集, 判断QQNumber是否在表里有重复, 有的话,就合并Passwird , 然后删除刚刚插入的QQNumber , 现在虽然逻辑正确, 但是量大了之后, 效率就低下啊, 还出了一个很蛋疼的错误 (等待用于页 (1:153858),数据库 ID 5 的缓冲区闩锁类型 2 时发生超时) 大牛麻烦帮忙看看怎么优化下这段代码
[解决办法]
合并passwird是什么意思?

假如插入的数据是

QQNumber Passwird
aa 1
aa 2
aa 3

难道说要将插入的数据更新为
aa 1,2,3
这种形式么?如果是这样你可以看看SQL中怎么去拼接字符串的,SQL 2005版本及其以上的多用 for xml path这种用法,在SQL2000中要创建函数来处理。

读书人网 >SQL Server

热点推荐