不用游标遍历表记录

create database dbTemp;
use dbTemp;
--首先在这个设计表的时候就有问题,因此我改了汽车表的一个字段 汽车生产国家 为 汽车生产城市
raiserror('正在创建表:国家表....',0,1)
CREATE TABLE 国家表(国家ID int CONSTRAINT PK_国家ID PRIMARY KEY,国家名 NVARCHAR(30))
go
raiserror('正在插入国家表三条记录....',0,1)
INSERT 国家表   SELECT 1,'香港'
UNION  ALL   SELECT 2,'中国'
UNION  ALL    SELECT 3,'美国'
go
raiserror('正在创建表:汽车表....',0,1)
CREATE TABLE 汽车表
(汽车ID int not null foreign key (汽车ID) references 国家表(国家ID),
汽车名 NVARCHAR(30),
汽车生产城市 Nvarchar(30)
)
go
raiserror('正在插入汽车表五条记录....',0,1)
INSERT 汽车表   SELECT 1,'捷达','香港'
UNION  ALL   SELECT 2,'大众','上海'
UNION  ALL    SELECT 3,'宝马','白宫'
UNION  ALL   SELECT 3,'奥迪','白宫'
UNION  ALL    SELECT 2,'现代','北京'

go
raiserror('正在删除国家表中国家名为 中国 的记录....',0,1)
--创建一个存储过程删除
--删除开始
go
create procedure SP_Delete国家表记录
 @国家名 nvarchar(30)
  WITH ENCRYPTION
as
  begin tran--启动事务
        declare @ERROR int
        set @ERROR=0
        begin
            declare @temp table
             (
               [汽车id] int,
               [汽车名] varchar(30),
               [汽车生产城市] varchar(30)
              )
             insert into @temp select *  from 汽车表 where (汽车ID in( select  国家ID from 国家表 where 国家名=@国家名))
             SET @ERROR =@ERROR +@@ERROR
                           IF (@ERROR <>0) GOTO EXT
             declare @temp汽车id int,@temp汽车名 varchar(30),@temp汽车生产城市 varchar(30)
             WHILE EXISTS(select * from @temp)
                 begin
                      SET ROWCOUNT 1
                      select @temp汽车id = [汽车id],@temp汽车名=[汽车名],@temp汽车生产城市=[汽车生产城市] from @temp
                      SET ROWCOUNT 0
                     delete from @temp where [汽车名] = @temp汽车名 and [汽车id]=@temp汽车id
                     SET @ERROR =@ERROR +@@ERROR
                           IF (@ERROR <>0) GOTO EXT
                     print '临时表汽车名:----'+@temp汽车名
                     Delete from 汽车表 where [汽车名] = @temp汽车名 and [汽车id]=@temp汽车id
                     SET @ERROR =@ERROR +@@ERROR
                           IF (@ERROR <>0) GOTO EXT
                  end
            delete from 国家表 where 国家名 = @国家名
            SET @ERROR =@ERROR +@@ERROR
                  IF (@ERROR <>0) GOTO EXT
        end
 
   --异常出口
   EXT:
    
   --判断执行状态
  IF (@ERROR =0)
     BEGIN
         COMMIT
     END
  ELSE
     ROLLBACK
go
--删除结束
--执行存储过程
exec SP_Delete国家表记录 '中国'
--删除数据库
go
use master
drop database dbTemp
go


--存储过程详解过程如下:
--必须先删除外键表:汽车表中所有 中国 的记录
--查找所有记录:
select * from 汽车表 where (汽车ID in( select  国家ID from 国家表 where 国家名='中国'))
--查找出有两条记录

--不使用游标遍历这两条记录并删除
 declare @temp table
 (
    [汽车id] int,
    [汽车名] varchar(30),
    [汽车生产城市] varchar(30)
  )
insert into @temp select *  from 汽车表 where (汽车ID in( select  国家ID from 国家表 where 国家名='中国'))
declare @temp汽车id int,@temp汽车名 varchar(30),@temp汽车生产城市 varchar(30)

--测试用
--select * from @temp

 WHILE EXISTS(select * from @temp)
 begin
     SET ROWCOUNT 1
     select @temp汽车id = [汽车id],@temp汽车名=[汽车名],@temp汽车生产城市=[汽车生产城市] from @temp
     SET ROWCOUNT 0
     --删除临时表记录
     delete from @temp where [汽车名] = @temp汽车名 and [汽车id]=@temp汽车id
     print '临时表汽车名:----'+@temp汽车名
     --删除汽车表记录
     Delete from 汽车表 where [汽车名] = @temp汽车名 and [汽车id]=@temp汽车id
 end
--最后删除国家表记录
delete from 国家表 where 国家名 = '中国'

posted @ 2008-12-13 16:50  HiEagle  阅读(842)  评论(1编辑  收藏  举报