zoukankan      html  css  js  c++  java
  • 不用游标遍历表记录

    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 国家名 = '中国'

  • 相关阅读:
    11
    961. N-Repeated Element in Size 2N Array
    用numpy.pad()对图像进行填充及简单的图像处理
    709. To Lower Case
    929. Unique Email Addresses
    771. Jewels and Stones
    谭凯---访谈录
    如何拍照
    主题阅读法
    社会各职业工作重心和流程
  • 原文地址:https://www.cnblogs.com/zjp8023/p/SQL02.html
Copyright © 2011-2022 走看看