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