表示:仮想テーブルマルチテーブルクエリは、テーブルの実際のテーブル構造を隠すには、データアクセスの操作を簡素化
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','北京')--事务在触发器中结束。批处理已中止。