22,210
社区成员
发帖
与我相关
我的任务
分享
USE iTao
IF EXISTS (SELECT name FROM sysobjects
WHERE name ='max_first_column'AND type ='P')
DROP PROCEDURE max_first_column
GO
create procedure max_first_column
@table varchar(20),
@rst_col_name varchar(20),
@max_id int output
as
declare @sql varchar(500)
begin
set @sql='declare cur_max cursor for select max('+@rst_col_name+')+from '+@table
exec (@sql)
open cur_max
fetch next from cur_max
into @max_id
while @@FETCH_STATUS=0
begin
fetch next from cur_max
into @max_id
select @max_id
end
close cur_max
deallocate cur_max
set @max_id=@max_id+1
return
end
go
declare @max_id2 int
execute max_first_column
"Department","DeptID",@max_id=@max_id2 output
print 'The max value is '+convert(varchar(10),@max_id2)
Create table Department
(
DeptID int check((dbo.RegexMatch(DeptID,'^[1-9]\d*$')=1)),
DeptName varchar(20) NOT NULL,
FatherID int check(([dbo].[RegexMatch](FatherID,'^([1-9]\d*)$')=1)),
SchoolName varchar(20) NOT NULL,
primary key (DeptID),
foreign key (FatherID) references Department
)
use iTao
IF OBJECT_ID('tri_upd_dept') IS NOT NULL
drop trigger tri_upd_dept
go
create trigger tri_upd_dept
on Department after update
as
SET NOCOUNT ON
if update(DeptID)
begin
ALTER TABLE Department
NOCHECK CONSTRAINT FK_Department_Department --我的里面的外码约束命名为
--FK_Department_Department
declare @n_id int,@o_id int
select @n_id=DeptID from inserted
select @o_id=DeptID from deleted
update Department set FatherID=@n_id
where FatherID=@o_id
ALTER TABLE Department
CHECK CONSTRAINT FK_Department_Department
end
go
--需要修改一下:
IF OBJECT_ID('Department') IS NOT NULL
DROP TABLE Department
GO
CREATE TABLE Department
(
DeptID INT
,DeptName VARCHAR(20) NOT NULL
,FatherID INT DEFAULT(0)
--,SchoolName VARCHAR(20) NOT NULL
,PRIMARY KEY(DeptID)
,CONSTRAINT FK__Departmen__Fathe__5E35CF0F
FOREIGN KEY(FatherID) REFERENCES Department(DeptID)
)
INSERT INTO Department
SELECT 1,'a',1 UNION ALL
SELECT 2,'b',1 UNION ALL
SELECT 3,'c',2 UNION ALL
SELECT 4,'d',2
IF OBJECT_ID('tr_test') IS NOT NULL
DROP TRIGGER tr_test
GO
CREATE TRIGGER tr_test ON Department
INSTEAD OF UPDATE
AS
SET XACT_ABORT ON
BEGIN TRAN
IF UPDATE(Deptid) -------------这里加个条件
ALTER TABLE Department
NOCHECK CONSTRAINT FK__Departmen__Fathe__5E35CF0F
IF EXISTS(SELECT 1 FROM deleted)
BEGIN
DECLARE @t TABLE(Deptid INT,Deptname VARCHAR(20),FatherID INT)
DELETE a
FROM Department a, deleted d
WHERE a.DeptID = d.DeptID
DELETE Department
OUTPUT deleted.* INTO @t
WHERE EXISTS(
SELECT 1
FROM deleted
WHERE Department.FatherID = DeptID
)
END
IF EXISTS(SELECT 1 FROM inserted)
BEGIN
INSERT INTO Department
SELECT * FROM inserted
INSERT INTO Department
SELECT b.DeptID,b.Deptname,a.DeptID
FROM inserted a
JOIN @t b
ON 1=1
END
ALTER TABLE Department
CHECK CONSTRAINT FK__Departmen__Fathe__5E35CF0F
COMMIT
GO
UPDATE Department
SET DeptID = 5
WHERE DeptID = 2
SELECT * FROM Department
/*
DeptID DeptName FatherID
----------- -------------------- -----------
1 a 1
3 c 5
4 d 5
5 b 1
(4 行受影响)
*/
IF OBJECT_ID('Department') IS NOT NULL
DROP TABLE Department
GO
CREATE TABLE Department
(
DeptID INT
,DeptName VARCHAR(20) NOT NULL
,FatherID INT DEFAULT(0)
--,SchoolName VARCHAR(20) NOT NULL
,PRIMARY KEY(DeptID)
,CONSTRAINT FK__Departmen__Fathe__5E35CF0F
FOREIGN KEY(FatherID) REFERENCES Department(DeptID)
)
INSERT INTO Department
SELECT 1,'a',1 UNION ALL
SELECT 2,'b',1 UNION ALL
SELECT 3,'c',2 UNION ALL
SELECT 4,'d',2
IF OBJECT_ID('tr_test') IS NOT NULL
DROP TRIGGER tr_test
GO
CREATE TRIGGER tr_test ON Department
INSTEAD OF UPDATE
AS
SET XACT_ABORT ON
BEGIN TRAN
ALTER TABLE Department
NOCHECK CONSTRAINT FK__Departmen__Fathe__5E35CF0F
IF EXISTS(SELECT 1 FROM deleted)
BEGIN
DECLARE @t TABLE(Deptid INT,Deptname VARCHAR(20),FatherID INT)
DELETE a
FROM Department a, deleted d
WHERE a.DeptID = d.DeptID
DELETE Department
OUTPUT deleted.* INTO @t
WHERE EXISTS(
SELECT 1
FROM deleted
WHERE Department.FatherID = DeptID
)
END
IF EXISTS(SELECT 1 FROM inserted)
BEGIN
INSERT INTO Department
SELECT * FROM inserted
INSERT INTO Department
SELECT b.DeptID,b.Deptname,a.DeptID
FROM inserted a
JOIN @t b
ON 1=1
END
ALTER TABLE Department
CHECK CONSTRAINT FK__Departmen__Fathe__5E35CF0F
COMMIT
GO
UPDATE Department
SET DeptID = 5
WHERE DeptID = 2
SELECT * FROM Department
/*
DeptID DeptName FatherID
----------- -------------------- -----------
1 a 1
3 c 5
4 d 5
5 b 1
(4 行受影响)
*/
Create table Department
(
DeptID int check((dbo.RegexMatch(DeptID,'^[1-9]\d*$')=1)),
DeptName varchar(20) NOT NULL,
FatherID int default(0) check(([dbo].[RegexMatch](FatherID,'^([1-9]\d*)$')=1)),
SchoolName varchar(20) NOT NULL,
primary key (DeptID),
foreign key (DeptID) references Department
)
USE iTao
go
IF EXISTS (SELECT name FROM sysobjects
WHERE name ='max_first_column'AND type ='P')
DROP PROCEDURE max_first_column
GO
create procedure max_first_column
@table varchar(20),
@rst_col_name varchar(20),
@max_id int output
as
declare @sql nvarchar(500)
begin
set @sql='select @max_id=max('+@rst_col_name+')+from '+@table
exec sp_executesql @sql,N'@max_id int output',@max_id output
open cur_max
set @max_id=isnull(@max_id,0)+1
return
end
go
declare @max_id2 int
execute max_first_column
"Department","DeptID",@max_id=@max_id2 output
print 'The max value is '+convert(varchar(10),@max_id2)
use db
go
create table tbx(
id int primary key identity(1,1),
v int
)
use db
go
insert tbx select 1 union all
select 3 union all
select 4 union all
select 2
go
select * from tbx
use db
go
create procedure up_test
@table nvarchar(100),
@colName nvarchar(100),
@value int output
as
declare @sql nvarchar(1000)
declare @v int
set @sql=''
set @sql=@sql+N'select @v=max('+cast(@colName as nvarchar(50))+') from '+cast(@table as nvarchar(50))
exec sp_executesql @sql,N'@v int output',@v=@v output
set @value=@v
go
declare @v int
exec up_test N'tbx',N'v',@v output
select @v
drop procedure up_test
drop table tb