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