日期:2014-05-17  浏览次数:20640 次

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中要创建函数来处理。