首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2013-04-02 
sql语句求优化,合并两条select语句, 小弟感激不尽USE [QQData]GO/****** Object:StoredProcedure [dbo].[C

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

热点排行