游标的定义

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


← Back to home