游标的定义
Steven · 2023-01-18 05:29 · 57 views · Windows · old id 116
DECLARE @RegionCode INT;
DECLARE @RegionName NVARCHAR(64);
DECLARE @ProvinceId INT;
-- 声明游标
DECLARE ProvinceCursor CURSOR FOR(
SELECT Id AS ProvinceId, region.RegionCode,region.RegionName FROM dbo.Provinces AS province
JOIN dbo.Regions AS region ON province.Name=SUBSTRING(region.RegionName,1, LEN(province.Name)) AND region.RegionType=1
);
-- 打开游标
OPEN ProvinceCursor;
-- 移动游标,加载数据
FETCH NEXT FROM ProvinceCursor
INTO @ProvinceId,@RegionCode,@RegionName;
WHILE @@FETCH_STATUS = 0
BEGIN
-- 根据游标数据进行操作,这里只输出要执行的 SQL 脚本,也可以直接 UPDATE,看自己需要
PRINT UPDATE dbo.Provinces SET Code = + CONVERT(NVARCHAR(12), @RegionCode)+, Name = N+@RegionName + WHERE Id = + CONVERT(NVARCHAR(12), @provinceId) +;;
-- 移动游标到下一条数据
FETCH NEXT FROM ProvinceCursor
INTO @ProvinceId,@RegionCode,@RegionName;
END;
CLOSE ProvinceCursor;
DEALLOCATE ProvinceCursor;
-----------------------------------
DECLARE @PIN NVARCHAR(10);
DECLARE @CardNo NVARCHAR(10);
-- 声明游标
DECLARE TempDataTableCursor CURSOR FOR(
select a.pin,a.CardNo from OA002.[dbo].SysUser a
left join BPMS.[dbo].[BPMS_User] b
on a.PIN = b.Code
where code is not null
);
-- 打开游标
OPEN TempDataTableCursor;
-- 移动游标,加载数据
FETCH NEXT FROM TempDataTableCursor
INTO @PIN,@CardNo;
WHILE @@FETCH_STATUS = 0
BEGIN
-- 根据游标数据直接进行操作UPDATE
UPDATE BPMS.[dbo].[BPMS_User] SET OICQ=@CardNo WHERE Code=@PIN;
-- 移动游标到下一条数据
FETCH NEXT FROM TempDataTableCursor
INTO @PIN,@CardNo;
END;
CLOSE TempDataTableCursor;
DEALLOCATE TempDataTableCursor;
====================================
--存储过程里面放置游标
Create procedure UpdateNo
as
begin
DECLARE UpdateNoCursor CURSOR --声明一个游标,查询满足条件的数据
FOR select psn_code from person where type=E and hku_no is null
open UpdateNoCursor --打开游标
declare @noToUpdate varchar(20) --声明一个变量,用于读取游标中的值
fetch next from UpdateNoCursor into @noToUpdate
while @@fetch_status=0 --循环读取
begin
--print @noToUpdate
update person set hku_no=dbo.GetExtUserHKUNo() where psn_code=@noToUpdate
fetch next from UpdateNoCursor
into @noToUpdate
end
close UpdateNoCursor --关闭游标
deallocate UpdateNoCursor --删除释放游标
end
--exec UpdateNo
====================================
判断数据库中是否存在某一存储过程:
if exists (select * from sysobjects where name= UpdateHKUNo and xtype =P)
print yes
else
print no
====================================
无参数的存储过程的创建、修改、执行、删除
create procedure Myprocedure --创建,修改时是alter
as
begin
--do something
select * from sysobjects
end
execute Myprocedure --执行
drop procedure Myprocedure
====================================
create proc ProcWithParam --创建带有传入参数的存储过程
@id int --参数没有用括号标记
as
begin
select * from sysobjects where id=@id --使用参数
end
exec ProcWithParam 4 --执行时,在右边附带参数
drop proc ProcWithParam
====================================
create proc ProuWithParamOut(@date datetime out) --不带out,将被默认为传入参数!
as
begin
select @date=crdate from sysobjects where id=1 --传出参数只能是一个值,如果不带条件地查找,得到的数值是一个列表,将只取最后一个值
end
declare @date datetime --声明一个变量,用于接收存储过程传出的参数
exec ProuWithParamOut @date out --调用时,需要右边附带用于接收传出参数的变量
select @date as 存储过程传出的参数 --取得传出的参数,并自定义列名
====================================
create proc ProuWithParamOut --不带out,将被默认为传入参数!
@date datetime out
as
begin
select @date=crdate from sysobjects where id=4 --传出参数只能是一个值,如果不带条件地查找,得到的数值是一个列表,将只取最后一个值
end