存储过程中利用游标做判断 执行速度慢
时间:2011-12-10
来源:互联网
业务如下:
从表A中取得电话字段到表B中的三个电话字段去匹配,只要表B中有一个电话匹配,即输出该条数据,以表A中电话循环。
※电话字段不是两表中的主键
以下存储过程,执行特别慢,请大家帮忙看看,数据量大约几万条左右。是通过游标,在游标中到表中的去匹配
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
从表A中取得电话字段到表B中的三个电话字段去匹配,只要表B中有一个电话匹配,即输出该条数据,以表A中电话循环。
※电话字段不是两表中的主键
以下存储过程,执行特别慢,请大家帮忙看看,数据量大约几万条左右。是通过游标,在游标中到表中的去匹配
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
不要用游标了
select * from 表A a
where exists(select 1 from 表B where 电话1=a.电话 or 电话2=a.电话 or 电话3=a.电话)
select * from 表A a
where exists(select 1 from 表B where 电话1=a.电话 or 电话2=a.电话 or 电话3=a.电话)
作者: ssp2009 发布时间: 2011-12-10
樓主的游標部分代碼的邏輯很奇怪耶,
1.變量@VAR_FatherTel,@VAR_OtherTel在游標循環中未使用?
2.插入臨時表#TEMPCUSTOMER的@VAR_EXISTTYPE,每次循環前都未初始化?
3.變量@VAR_MotherTel的值來自MOBILEPHONE1,為何還需要MOBILEPHONE1=@VAR_MotherTel?
1.變量@VAR_FatherTel,@VAR_OtherTel在游標循環中未使用?
2.插入臨時表#TEMPCUSTOMER的@VAR_EXISTTYPE,每次循環前都未初始化?
3.變量@VAR_MotherTel的值來自MOBILEPHONE1,為何還需要MOBILEPHONE1=@VAR_MotherTel?

作者: ap0405140 发布时间: 2011-12-11
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28