存储过程中利用游标select总判断,执行慢
时间:2011-12-10
来源:互联网
以下存过过程,执行特别慢,请大家帮忙看看,数据量大约1万条左右。
ALTER PROCEDURE [dbo].[BatchImportChkReptBabyInfo2]
@CustomerDt JetImportCustomers READONLY
AS
BEGIN
--****************定义临时表,用于返回用****************
CREATE TABLE #TEMPCUSTOMER (
VAR_EXISTTYPE INT NULL)
--****************定义变量****************
--联系方式1
DECLARE
@VAR_MotherTel VARCHAR(20)
= NULL ;
--联系方式2
DECLARE
@VAR_FatherTel VARCHAR(20)
= NULL ;
--联系方式3
DECLARE
@VAR_OtherTel VARCHAR(20)
= NULL ;
DECLARE
@VAR_EXISTTYPE INT
= 0 ;
DECLARE
@VAR_EXISTCNT INT
= 0 ;
DECLARE
@VAR_EXISTTOTALCNT INT
= 0 ;
DECLARE CUSTOMER_CURSOR CURSOR FOR
SELECT MOBILEPHONE1,MOBILEPHONE2,MOBILEPHONE3
FROM KH_QZKH
OPEN CUSTOMER_CURSOR
FETCH NEXT FROM CUSTOMER_CURSOR
INTO @VAR_MotherTel,@VAR_FatherTel,@VAR_OtherTel
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (ISNULL(@VAR_MotherTel,'') <> '')
BEGIN
SELECT @VAR_EXISTCNT = count(CUSTOMERUID)
FROM KH_QZKH
WHERE ISDEL = 0
AND (MOBILEPHONE1 = @VAR_MotherTel)
IF (@VAR_EXISTCNT > 0)
BEGIN
SET @VAR_EXISTTYPE = 11
;
--返回值
SET @VAR_EXISTTOTALCNT = @VAR_EXISTTOTALCNT + 1
;
END
END
--插入到临时表中
INSERT INTO #TEMPCUSTOMER
VALUES (@VAR_EXISTTYPE)
FETCH NEXT FROM CUSTOMER_CURSOR
INTO @VAR_MotherTel,@VAR_FatherTel,@VAR_OtherTel
END
CLOSE CUSTOMER_CURSOR
DEALLOCATE CUSTOMER_CURSOR
--返回@CustomerDt
SELECT
VAR_EXISTTYPE AS EXISTTYPE
FROM #TEMPCUSTOMER
DROP TABLE #TEMPCUSTOMER
return @VAR_EXISTTOTALCNT;
END
ALTER PROCEDURE [dbo].[BatchImportChkReptBabyInfo2]
@CustomerDt JetImportCustomers READONLY
AS
BEGIN
--****************定义临时表,用于返回用****************
CREATE TABLE #TEMPCUSTOMER (
VAR_EXISTTYPE INT NULL)
--****************定义变量****************
--联系方式1
DECLARE
@VAR_MotherTel VARCHAR(20)
= NULL ;
--联系方式2
DECLARE
@VAR_FatherTel VARCHAR(20)
= NULL ;
--联系方式3
DECLARE
@VAR_OtherTel VARCHAR(20)
= NULL ;
DECLARE
@VAR_EXISTTYPE INT
= 0 ;
DECLARE
@VAR_EXISTCNT INT
= 0 ;
DECLARE
@VAR_EXISTTOTALCNT INT
= 0 ;
DECLARE CUSTOMER_CURSOR CURSOR FOR
SELECT MOBILEPHONE1,MOBILEPHONE2,MOBILEPHONE3
FROM KH_QZKH
OPEN CUSTOMER_CURSOR
FETCH NEXT FROM CUSTOMER_CURSOR
INTO @VAR_MotherTel,@VAR_FatherTel,@VAR_OtherTel
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (ISNULL(@VAR_MotherTel,'') <> '')
BEGIN
SELECT @VAR_EXISTCNT = count(CUSTOMERUID)
FROM KH_QZKH
WHERE ISDEL = 0
AND (MOBILEPHONE1 = @VAR_MotherTel)
IF (@VAR_EXISTCNT > 0)
BEGIN
SET @VAR_EXISTTYPE = 11
;
--返回值
SET @VAR_EXISTTOTALCNT = @VAR_EXISTTOTALCNT + 1
;
END
END
--插入到临时表中
INSERT INTO #TEMPCUSTOMER
VALUES (@VAR_EXISTTYPE)
FETCH NEXT FROM CUSTOMER_CURSOR
INTO @VAR_MotherTel,@VAR_FatherTel,@VAR_OtherTel
END
CLOSE CUSTOMER_CURSOR
DEALLOCATE CUSTOMER_CURSOR
--返回@CustomerDt
SELECT
VAR_EXISTTYPE AS EXISTTYPE
FROM #TEMPCUSTOMER
DROP TABLE #TEMPCUSTOMER
return @VAR_EXISTTOTALCNT;
END
作者: iamheyjudy 发布时间: 2011-12-10
你写的太多,懒得看,不如说下你的需求。
作者: ssp2009 发布时间: 2011-12-10
用游标是不会快到哪里去的。
作者: fredrickhu 发布时间: 2011-12-10
想办法别用游标吧,游标最慢了,没循环一次相当于select一次表
作者: koumingjie 发布时间: 2011-12-10
业务如下:从表A中取得电话字段到表B中的三个电话字段去匹配,只要表B中有一个电话匹配,即输出该条,以此A表中电话循环。*电话字段不是两表中的主键
作者: iamheyjudy 发布时间: 2011-12-10
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28