SQLSERVER보기 기능, 저장 프로 시저, 트리거

보기 : 가상 테이블 멀티 테이블 쿼리는 테이블의 실제 테이블 구조를 숨 깁니다 데이터 액세스 작업을 단순화

IF EXISTS(SELECT 1 FROM SYSOBJECTS WHERE TYPE='V' AND NAME='V_TONY')
DROP VIEW V_TONY
GO
CREATE VIEW V_TONY
AS
SELECT A.str1 AS A_STR1,A.str1 AS A_STR2,B.str1 AS B_STR FROM A,B
GO

기능 : 단일 기능

标量值函数:通过生日计算年龄
IF OBJECT_ID('F_GetAge') IS NOT NULL
DROP FUNCTION F_GetAge
GO
CREATE FUNCTION F_GetAge(@birthday datetime)
RETURNS INT
AS
BEGIN
DECLARE @AGE INT
SET @AGE=YEAR(GETDATE())-YEAR(@birthday)
RETURN @AGE
END
GO

SELECT DBO.F_GetAge('1991-02-05')


表值函数:通过姓名返回一些信息
IF OBJECT_ID('F_GetInfoByName') IS NOT NULL
DROP FUNCTION F_GetInfoByName
GO
CREATE FUNCTION F_GetInfoByName(@name char(10))
RETURNS TABLE
AS
RETURN (SELECT * FROM Customers WHERE CNAME=@name)
GO

저장 프로 시저 : 배치 파일과 유사한 복잡한 작업의 일련을 수행 할 수 있습니다. 컴파일 만드는 경우에만 있기 때문에, 그래서 때마다 효율을 개선, 다시 컴파일 저장 프로 시저를 실행하지 않습니다

无参数存储过程
IF EXISTS(SELECT 1 FROM SYSOBJECTS WHERE TYPE='P' AND NAME='P_TONY')
DROP PROCEDURE P_TONY
GO
CREATE PROCEDURE P_TONY
--WITH ENCRYPTION --加密
AS
BEGIN
DECLARE @DT  DATETIME
SELECT @DT=ADDDATE FROM A;
	--IF(DATEDIFF(DAY,@DT,GETDATE())>0)
	BEGIN
		UPDATE A SET ADDDATE = GETDATE() WHERE DATEDIFF(DAY,ADDDATE,GETDATE())>0;
	END
END

EXEC P_TONY




1、有参数存储过程:RETURN
IF OBJECT_ID('P_TONY3') IS NOT NULL
DROP PROCEDURE P_TONY3
GO
CREATE PROCEDURE P_TONY3(@USERNAME VARCHAR(20))
AS
DECLARE @MSG INT
BEGIN
	SELECT @MSG=COUNT(1) FROM Custs WHERE NAME LIKE '%'+@USERNAME+'%'
RETURN @MSG
END
GO


2、有参数存储过程:OUTPUT
IF EXISTS(SELECT 1 FROM SYSOBJECTS WHERE TYPE='P' AND NAME='P_TONY2')
DROP PROCEDURE P_TONY2
GO
CREATE PROCEDURE P_TONY2(@USERNAME VARCHAR(20),@MSG VARCHAR(20) OUTPUT)
AS
BEGIN
	IF(SELECT COUNT(1) FROM Custs WHERE NAME=@USERNAME)>0
		SET @MSG='此用户名存在'
	ELSE
		SET @MSG='此用户名不存在'
END
GO

DECLARE @RES VARCHAR(20)
EXEC P_TONY2 '李四',@RES OUTPUT
SELECT @RES


3、上述都存在的参数存储过程:RETURN和OUTPUT
IF EXISTS(SELECT 1 FROM SYSOBJECTS WHERE TYPE='P' AND NAME='P_TONY4')
DROP PROCEDURE P_TONY4
GO
CREATE PROCEDURE P_TONY4(@USERNAME VARCHAR(20),@MSG VARCHAR(20) OUTPUT)
AS
DECLARE @NUM INT
BEGIN
	IF(SELECT COUNT(1) FROM Custs WHERE NAME LIKE '%'+@USERNAME+'%')>0
		SET @MSG='姓氏存在'
	ELSE
		SET @MSG='姓氏不存在'
SELECT @NUM=COUNT(1) FROM Custs WHERE NAME LIKE '%'+@USERNAME+'%'
RETURN @NUM
END
GO

DECLARE @NUM INT
DECLARE @RES VARCHAR(20)
EXEC @NUM=P_TONY4 '张',@RES OUTPUT
SELECT @NUM,@RES

트리거 : 특별한 저장 과정, 테이블과 테이블, 데이터 무결성 사이의 구현 제약은 또한 일부 삭제 로그를 할 수

增加一条记录,如果城市是北京就回滚,其他城市就插入到两张表(表Custs就是通过表Customers触发的)
IF OBJECT_ID('TR_TONY') IS NOT NULL
DROP TRIGGER TR_TONY
GO
CREATE TRIGGER TR_TONY ON Customers
FOR INSERT
AS
BEGIN
	DECLARE @CNAME CHAR(10),@CITY CHAR(10)
	SELECT @CNAME=CNAME,@CITY=city FROM INSERTED
	IF(SELECT CITY FROM Customers WHERE CNAME=@CNAME)='北京'
		BEGIN
		SELECT '北京暂时不开通'
		ROLLBACK TRANSACTION
		END
	ELSE
		INSERT INTO Custs VALUES(@CNAME,@CITY)
		SELECT 'OK'
END
GO


INSERT INTO Customers VALUES('Tony','上海')--OK
INSERT INTO Customers VALUES('Tony1','北京')--事务在触发器中结束。批处理已中止。

 

게시 46 개 원래 기사 · 원의 찬양 9 · 전망 3645

추천

출처blog.csdn.net/weixin_41896770/article/details/103019745