触发器,出入库操作(单据写入)时自动更新物料的当前库存数字

本文通过示例详细介绍了如何使用SQL触发器在出入库操作时自动更新物料库存,包括创建、修改和删除触发器,以及插入、删除和更新数据时触发器的执行逻辑,确保库存数据的准确性。

--  作者:彭建军
--  日期:2005-06-27
--  页面:Page3
--  概要:触发器的创建、修改、删除以及调用
--  说明:以下示例均在[查询分析器]下进行,可配合图形界面进行测试
--================================================--

/*
建立虚拟测试环境,包含:表[卷烟库存表],表[卷烟销售表]。
请大家注意跟踪这两个表的数据,体会触发器到底执行了什么业务逻辑,对数据有什么影响。
为了能更清晰的表述触发器的作用,表结构存在数据冗余,且不符合第三范式,这里特此说明。
*/

USE Master
GO

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷烟库存表')
    DROP TABLE 卷烟库存表
GO
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷烟销售表')
    DROP TABLE 卷烟销售表
GO

--业务规则:销售金额 = 销售数量 * 销售单价 业务规则。

CREATE TABLE 卷烟销售表
(
    卷烟品牌        VARCHAR(40) PRIMARY KEY NOT NULL,
    购货商          VARCHAR(40) NULL,
    销售数量        INT NULL,
    销售单价        MONEY NULL,
    销售金额        MONEY NULL
)
GO

--业务规则:库存金额 = 库存数量 * 库存单价 业务规则。

CREATE TABLE 卷烟库存表
(
    卷烟品牌        VARCHAR(40) PRIMARY KEY NOT NULL,
    库存数量        INT NULL,
    库存单价        MONEY NULL,
    库存金额        MONEY NULL
)
GO

--创建触发器,示例1

/*
创建触发器[T_INSERT_卷烟库存表],这个触发器较简单。
说明:      每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。
触发器功能:    强制执行业务规则,保证插入的数据中,库存金额 = 库存数量 * 库存单价。
注意:      [INSERTED]、[DELETED]为系统表,不可创建、修改、删除,但可以调用。
重要:      这两个系统表的结构同插入数据的表的结构。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷烟库存表')
    DROP TRIGGER T_INSERT_卷烟库存表
GO

CREATE TRIGGER T_INSERT_卷烟库存表
ON 卷烟库存表
FOR INSERT
AS
--提交事务处理
BEGIN TRANSACTION
    --强制执行下列语句,保证业务规则
    UPDATE 卷烟库存表
    SET 库存金额 = 库存数量 * 库存单价
    WHERE 卷烟品牌 IN (SELECT 卷烟品牌 from INSERTED)
COMMIT TRANSACTION
GO

/* 
针对[卷烟库存表],插入测试数据:
注意,第一条数据(红塔山新势力)中的数据符合业务规则,
第二条数据(红塔山人为峰)中,[库存金额]空,不符合业务规则,
第三条数据(云南映像)中,[库存金额]不等于[库存数量]乘以[库存单价],不符合业务规则。
第四条数据库存数量为0。
请注意在插入数据后,检查[卷烟库存表]中的数据是否 库存金额 = 库存数量 * 库存单价。
*/

INSERT INTO 卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)
    SELECT '红塔山新势力',100,12,1200 UNION ALL
    SELECT '红塔山人为峰',100,22,NULL UNION ALL
    SELECT '云南映像',100,60,500      UNION ALL
    SELECT '玉溪',0,30,0
GO

--查询数据

SELECT * FROM 卷烟库存表
GO
/*

结果集

RecordId  卷烟品牌       库存数量  库存单价  库存金额
--------  ------------  --------  -------  ---------
1         红塔山新势力   100       12.0000  1200.0000
2         红塔山人为峰   100       22.0000  2200.0000
3         云南映像       100       60.0000  6000.0000
4         玉溪           0         30.0000  .0000

(所影响的行数为 4 行)

*/


--触发器示例2

/*
创建触发器[T_INSERT_卷烟销售表],该触发器较复杂。
说明:       每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。
触发器功能:    实现业务规则。
业务规则:   如果销售的卷烟品牌不存在库存或者库存为零,则返回错误。
            否则则自动减少[卷烟库存表]中对应品牌卷烟的库存数量和库存金额。
*/
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷烟销售表')
    DROP TRIGGER T_INSERT_卷烟销售表
GO

CREATE TRIGGER T_INSERT_卷烟销售表
ON 卷烟销售表
FOR INSERT
AS
BEGIN TRANSACTION
    --检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零
    IF NOT EXISTS (
        SELECT 库存数量
        FROM 卷烟库存表
        WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED)
    )
        BEGIN
            --返回错误提示
            RAISERROR('错误!该卷烟不存在库存,不能销售。',16,1)
            --回滚事务
            ROLLBACK
            RETURN
        END

    IF EXISTS (
        SELECT 库存数量
        FROM 卷烟库存表
        WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED) AND
        库存数量 <= 0          
    )
        BEGIN
            --返回错误提示
            RAISERROR('错误!该卷烟库存小于等于0,不能销售。',16,1)
            --回滚事务
            ROLLBACK
            RETURN
        END
   
    --对合法的数据进行处理

    --强制执行下列语句,保证业务规则
    UPDATE 卷烟销售表
    SET 销售金额 = 销售数量 * 销售单价
    WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED)

    DECLARE @卷烟品牌 VARCHAR(40)
    SET @卷烟品牌 = (SELECT 卷烟品牌 FROM INSERTED)

    DECLARE @销售数量 MONEY
    SET @销售数量 = (SELECT 销售数量 FROM INSERTED)

    UPDATE 卷烟库存表
    SET 库存数量 = 库存数量 - @销售数量,
        库存金额 = (库存数量 - @销售数量)*库存单价
    WHERE 卷烟品牌 = @卷烟品牌
COMMIT TRANSACTION
GO

--请大家自行跟踪[卷烟库存表]和[卷烟销售表]的数据变化。
--针对[卷烟销售表],插入第一条测试数据,该数据是正常的。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
    SELECT '红塔山新势力','某购货商',10,12,1200
GO

--针对[卷烟销售表],插入第二条测试数据,该数据 销售金额 不等于 销售单价 * 销售数量。
--触发器将自动更正数据,使 销售金额 等于 销售单价 * 销售数量。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
    SELECT '红塔山人为峰','某购货商',10,22,2000
GO

--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在 卷烟库存表 中找不到对应。
--触发器将报错。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
    SELECT '红河V8','某购货商',10,60,600
GO

/*
结果集
服务器: 消息 50000,级别 16,状态 1,过程 T_INSERT_卷烟销售表,行 15
错误!该卷烟不存在库存,不能销售。
*/

--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在 卷烟库存表 中库存为0。
--触发器将报错。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
    SELECT '玉溪','某购货商',10,30,300
GO

/*
结果集
服务器: 消息 50000,级别 16,状态 1,过程 T_INSERT_卷烟销售表,行 29
错误!该卷烟库存小于等于0,不能销售。
*/
--查询数据
SELECT * FROM 卷烟库存表

SELECT * FROM 卷烟销售表
GO

/*
补充:
1、本示例主要通过一个简单的业务规则实现来进行触发器使用的说明,具体的要根据需要灵活处理;
2、关于触发器要理解并运用好 INSERTED ,DELETED 两个系统表;
3、本示例创建的触发器都是 FOR INSERT ,具体的语法可参考:

    Trigger语法

    CREATE TRIGGER trigger_name
    ON { table | view }
    [ WITH ENCRYPTION ] --用于加密触发器
    {
        { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
            [ WITH APPEND ]
            [ NOT FOR REPLICATION ]
            AS
            [ { IF UPDATE ( column )
                [ { AND | OR } UPDATE ( column ) ]
                    [ ...n ]
            | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
                    { comparison_operator } column_bitmask [ ...n ]
            } ]
            sql_statement [ ...n ]
        }
    }

4、关于触发器,还应该注意
(1)、DELETE 触发器不能捕获 TRUNCATE TABLE 语句。
(2)、触发器中不允许以下 Transact-SQL 语句:
        ALTER DATABASE CREATE DATABASE DISK INIT
        DISK RESIZE DROP DATABASE LOAD DATABASE
        LOAD LOG RECONFIGURE RESTORE DATABASE
        RESTORE LOG
(3)、触发器最多可以嵌套 32 层。

*/

--修改触发器
--实质上,是将 CREATE TRIGGER ... 修改为 ALTER TRIGGER ...即可。

--删除触发器
DROP TRIGGER xxx
GO

--删除测试环境
DROP TABLE 卷烟库存表
GO
DROP TABLE 卷烟销售表
GO
DROP TRIGGER T_INSERT_卷烟库存表
GO
DROP TRIGGER T_INSERT_卷烟销售表
GO


/*
触发器:出入库操作(单据写入)时自动更新物料的当前库存数字
作者:ranzj@vip.sina.com
日期:2005年12月4日 18:26
*/
CREATE TRIGGER [TRI_CRK2KC_INSERT] ON [dbo].[CK]
AFTER INSERT
AS

BEGIN

  DECLARE @CRK int,@PJBH varchar(20),@SL int   --定义变量:出入库标志、单据编号、出入库标数量
  SELECT @CRK=[CRK],@PJBH=[PJBH],@SL=[SL] FROM [INSERTED] --赋值:出入库单据写入时的入库标志、单据编号、出入库标数量

  IF @CRK=1  --如果为入库,当前库存增入库数
    UPDATE [WLB] SET [KC]=[KC]+@SL WHERE [BM]=@PJBH
  ELSE   --如果为出库,当前库存减出库数
    UPDATE [WLB] SET [KC]=[KC]-@SL WHERE [BM]=@PJBH

END


---------------------------------------------------
/*
触发器:出入库操作(单据删除)时自动更新物料的当前库存数字
作者:ranzj@vip.sina.com
日期:2005年12月4日 18:26
*/
CREATE TRIGGER [TRI_CRK2KC_DELETE] ON [dbo].[CK]
FOR DELETE
AS

BEGIN

  DECLARE @CRK int,@PJBH varchar(20),@SL int   --定义变量:出入库标志、单据编号、出入库标数量
  SELECT @CRK=[CRK],@PJBH=[PJBH],@SL=[SL] FROM [DELETED] --赋值:出入库单据删除时的入库标志、单据编号、出入库标数量

  IF @CRK=1 --如果为入库单据删除,当前库存减原入库数
    UPDATE [WLB] SET [KC]=[KC]-@SL WHERE [BM]=@PJBH
  ELSE  --如果为出库单据删除,当前库存增原出库数
    UPDATE [WLB] SET [KC]=[KC]+@SL WHERE [BM]=@PJBH

END

---------------------------------------------------
/*
触发器:出入库操作(单据修改)时自动更新物料的当前库存数字
作者:ranzj@vip.sina.com
日期:2005年12月4日 18:26
*/
CREATE TRIGGER [TRI_CRK2KC_UPDATE] ON [dbo].[CK]
FOR UPDATE
AS

BEGIN

  DECLARE @CRK int,@PJBH varchar(20),@SL int   --定义变量:出入库标志、单据编号、出入库标数量

  SELECT @CRK=[CRK],@PJBH=[PJBH],@SL=[SL] FROM [DELETED] --赋值:出入库单据修改前的入库标志、单据编号、出入库标数量
  IF @CRK=1  --如果为入库单据修改,先让当前库存减原入库数
    UPDATE [WLB] SET [KC]=[KC]-@SL WHERE [BM]=@PJBH
  ELSE   --如果为出库单据修改,先让当前库存增原出库数
    UPDATE [WLB] SET [KC]=[KC]+@SL WHERE [BM]=@PJBH

  SELECT @CRK=[CRK],@PJBH=[PJBH],@SL=[SL] FROM [INSERTED] --赋值:出入库单据修改后的入库标志、单据编号、出入库标数量
  IF @CRK=1  --如果为入库单据修改,然后让当前库存增入库数
    UPDATE [WLB] SET [KC]=[KC]+@SL WHERE [BM]=@PJBH
  ELSE   --如果为出库单据修改,然后让当前库存减出库数
    UPDATE [WLB] SET [KC]=[KC]-@SL WHERE [BM]=@PJBH

END


---------------------------------------------------
/*
触发器:修改WLB的期初库存时自动更新物料的当前库存数字
作者:ranzj@vip.sina.com
日期:2005年12月4日 18:59
*/
CREATE TRIGGER [TRI_QC2KC_UPDATE] ON [dbo].[WLB]
FOR UPDATE
AS

IF UPDATE([QC])  --仅当WLB的期初库存被修改时才触发,其他字段修改时不触发
BEGIN

  DECLARE @BM varchar(20),@QC_1 int,@QC_2 int --定义变量:物料编号(在WLB表中应唯一)、期初库存修改前值、期初库存修改后值

  SELECT @QC_1=[QC] FROM [DELETED]  --赋值:期初库存修改前的物料编号、期初库存
  SELECT @BM=[BM],@QC_2=[QC] FROM [INSERTED] --赋值:期初库存修改后的物料编号、期初库存

  IF @QC_1<>@QC_2  --期初库存修改前、后值不等时才修改当前库存数字;否则无动作
    UPDATE [WLB] SET [KC]=[KC]+(@QC_2-@QC_1) WHERE [BM]=@BM

END

---------------------------------------------------

SQL sever 2008 Rar! ?s X<t ? ? ? ?祕BwL0 17240671-1.sql ?<9--2018年3月9日 --1.查询course表的所有信息(所有行所有列) USE Xk GO SELECT * FROM Course --有哪些种类的选修课?学分是多少 USE XK GO SELECT Kind,Credit FROM Crouse GO 修改列名字 SELECT '课程种类'=Kind,'学分'=Credit FROM Course GO --查询Course表的前10行 SELECT TOP 10 * FROM Course GO --查询Course表的前10%行 USE Xk GO SELECT TOP 10 PERCENT * FROM Course GO ㄚt 扚 ? ? h2=C蚅0! 17240671-13.3实训.sql [?灜? sql ?`?-2018.4.18 USE master GO --单元五 创建于管理数据库 --创建数据库Sale CREATE DATABASE sale ON PRIMARY (NAME=sale, FILENAME='C:\\sale.mdf', SIZE=4MB, MAXSIZE=20MB, FILEGROWTH=1MB ) LOG ON (NAME=sale_log, FILENAME='C:\\sale_log.ldf', SIZE=10MB, MAXSIZE=20MB, FILEGROWTH=1MB) GO --向数据库增加文件组UserGroup ALTER DATABASE sale ADD FILEGROUP UserGroup GO ALTER DATABASE sale ADD FILE (NAME='sale_data3', FILENAME='D:\\sale_data3.ndf', SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=1MB ) TO FILEGROUP UserGroup GO sp_help sale GO USE master GO -- 单元六 创建于管理数据表 --创建客户表结构Customer CREATE TABLE Customer (CusNO nvarchar(3) NOT NULL, CusName nvarchar(10), Address nvarchar(20)NOT NULL, Tel nvarchar(20) NOT NULL) GO --创建场品表结构Product CREATE TABLE Product (ProNO nvarchar(5) NOT NULL, ProName nvarchar(20)NOT NULL, Price Decimal(8,2) NOT NULL, Stocks Decimal(6,0) NOT NULL) GO --创建入库表结构Proln CREATE TABLE Proln (InputDate DateTime NOT NULL, ProNo nvarchar(5) NOT NULL, Quantity Decimal(6,0) NOT NULL) GO --创建销售表结构Proout CREATE TABLE Proout (SaleDate DateTime NOT NULL, CusNo nvarchar(3) NOT NULL, ProNo nvarchar(5) NOT NULL, Quantity Decimal(6,0) NOT NULL, Amount Decimal(8,2)NOT NULL) GO --向已创建的表添加数据 INSERT Customer VALUES('001','杨婷','深圳','0755-22221111') INSERT Customer VALUES('002','陈萍','深圳','0755-22223333') INSERT Customer VALUES('003','李东','深圳','0755-22225555') INSERT Customer VALUES('004','叶合','广州','0755-22225555') INSERT Customer VALUES('005','谭新','广州','0755-22225555') Go INSERT Customer VALUES('0001','电视',3000.00,800) INSERT Customer VALUES('0002','空调',2000.00,500) INSERT Customer VALUES('0003','床',1000.00,300) INSERT Customer VALUES('0004','餐桌',1500.00,200) INSERT Customer VALUES('0005','音响',5000.00,600) INSERT Customer VALUES('0006','沙发',6000.00,100) Go INSERT Proln VALUES('2006-1-1','00001',10) INSERT Proln VALUES('2006-1-2','00002',5) INSERT Proln VALUES('2006-1-3','00001',5) INSERT Proln VALUES('2006-2-1','00003',10) INSERT Proln VALUES('2006-2-2','00001',10) INSERT Proln VALUES('2006-2-3','00003',20) INSERT Proln VALUES('2006-3-2','00001',10) INSERT Proln VALUES('2006-3-2','00004',30) INSERT Proln VALUES('2006-3-3','00003',20) Go INSERT ProOut VALUES('2006-1-1','001','00001',10) INSERT ProOut VALUES('2006-1-2','001','00002',5) INSERT ProOut VALUES('2006-1-3','002','00001',5) INSERT ProOut VALUES('2006-2-1','002','00003',10) INSERT ProOut VALUES('2006-2-2','001','00001',10) INSERT ProOut VALUES('2006-2-3','001','00003',20) INSERT ProOut VALUES('2006-3-2','003','00001',10) INSERT ProOut VALUES('2006-3-2','003','00004',30) INSERT ProOut VALUES('2006-3-3','002','00003',20) Go --单元七 实施数据完整性(约束) --使用ALTER TABLE 语句为已经创建的表添加主键约束、外键约束 --主键 ALTER TABLE Customer ADD CONSTRAINT PK_Customer PRIMARY KEY(CusNo) GO ALTER TABLE Product ADD CONSTRAINT PK_Product PRIMARY KEY(ProNo) GO --外键 ALTER TABLE Proout ADD CONSTRAINT FK_Proout_Product FOREIGN KEY(ProNo) REFERENCES Product(ProNo) GO ALTER TABLE Proout ADD CONSTRAINT FK_Proout_Customer FOREIGN KEY(CusNo) REFERENCES Customer(Customer) GO ALTER TABLE Proln ADD CONSTRAINT FK_Proln_Product FOREIGN KEY(ProNo) REFERENCES Product(ProNo) GO --约束客户表Customer的CosNo的列值长度为3,产品表Product 的ProNo 列值长度为5 ALTER TABLE Coustomer ADD CONSTRAINT CK_Customer_CusNo CHECK (CusNo like '[0-9][0-9][0-9]') GO ALTER TABLE Product ADD CONSTRAINT CK_Product_ProNo CHECK(ProNo like'[0-9][0-9][0-9][0-9][0-9]') GO --对产品表Product 的Stocks列、Price列、入库表Proln的Quanity列、销售表ProOut 的Quanity --列值进行约束,使其值大于0 ALTER TABLE Product ADD CONSTRAINT CK_Product_Stock CHECK(Stock>0) GO ALTER TABLE Product ADD CONSTRAINT CK_Product_Price CHECK(Price>0) GO ALTER TABLE Proln ADD CONSTRAINT CK_Proln_Quantity CHECK (Quantity>0) GO ALTER TABLE ProOut ADD CONSTRAINT CK_ProOut_Quantity CHECK(Quantity>0) GO --对销售表ProOut的SaleDate 列进行约束,当不输入值,系统默认其值为系统当前日期 CREATE DEFAULT Today AS GETDATEA() GO /*ALTER TABLE ProOut ADD CONSTRAINT DF_ProOut_SaleDate DEFAULT('当前日期')FOR Date GO*/ --单元八 索引 --用户按照CusName查询客户信息,希望提高查询速度 CREATE UNIQUE INDEX IX_CusName ON Customer(CusName) GO --用户按照ProName查询产品信息,希望提高查询速度 CREATE UNIQUE INDEX IX_ProName ON Product(ProName) GO --用户按照SaleDate查询产品信息,希望提高查询速度 CREATE UNIQUE INDEX IX_SaleDate ON ProOut(SaleDate) GO --单元九 语言编程基础 --计算有多少种产品(假设为x),然后显示一条信息:共有X种产品 DECLARE @X int SET @X =(SELECT COUNT (*) FROM Product ) PRINT '共有'+convert (char(2),@x)+'种产品。' GO --编写计算n!(n=20)的程序,并显示结果。 DECLARE @X int,@product int SELECT @X=1,@product=1 WHILE @X<=20 BEGIN SELECT @X=@X+1 SELECT @product=@product*@X END SELECT '1*2*3*......*20的积'=@product GO --单元十 创建于管理视图 --创建视图V_Sale1,并显示销售日期、客户编号、客户姓名、产品编号、产品名称、单价 --销售数量、销售金额 CREATE VIEW V_Sale1 AS SELECT SaleDate,Customer.CusNO,CusName,Product.ProNO,ProName,Price,Proout.Quantity, SM=(Price *Proout.Quantity) FROM Customer ,Product,Proln,Proout WHERE Customer.CusNO=Proout.CusNo AND Product.ProNO=Proln.ProNo AND Product.ProNO=Proout.ProNo AND Proout.Quantity=Proln.Quantity GO --创建视图V-Sale2,统计每种产品的销售数量和销售金额。统计结果包括产品编号、 --产品名称、单价、销售数量和销售金额 CREATE VIEW V_Sale2 AS SELECT Product.ProNO ,ProName,Price,Proout.Quantity ,SM=(Price *Proout.Quantity) FROM Product ,Proout ,Proln GROUP BY ProName GO --创建视图V_Sale3,统计销售金额在10万以下的产品信息。 CREATE VIEW V_Sale3 AS SELECT Product.ProNO ,Product.ProName FROM Product ,Proout WHERE Product.ProNO=Proout.ProNo GROUP BY Product.ProNO,ProName HAVING SUM (Price*Quantity)<100000 GO --单元十一 创建管理存储过程 --创建存储过程P_Sale1,统计每种产品的销售数量和销售金额 CREATE PROCEDURE P_Sale1 AS SELECT Product.ProNO,ProName ,Price ,SUM(Quantity),SM=SUM(Price*Quantity) FROM Proout,Product WHERE Product.ProNO=Proout.ProNo GROUP BY Product .ProNO,ProName,Price GO --创建存储过程P_Sale2,能够根据指定客户统计,汇总该客户购买每种产品的数量和花费金额 CREATE PROCEDURE P_Sale2 @CusNo nvarchar(3) AS SELECT Product.ProNO,ProName,Price ,SUM(Quantity),SUM(Price*Quantity) FROM Product,Proout WHERE CusNO=@CusNO AND Product.ProNO=Proout.ProNo GROUP BY Product .ProNO,ProName ,Price GO --创建存储过程P_Sale3,能够根据指定的产品编号和日期,以输出参数的形式得到该产品的销售金额 CREATE PROCEDURE P_Sale3 @ProNo nvarchar(5),@SaleDate DateTime,@MONEY Decimal(8,2)OUTPUT AS SET @MONEY=( SELECT SUM(Price*Quantity) FROM Proout,Product WHERE Product.ProNO=Proout.ProNo AND Product.ProNO=@ProNo AND SaleDate =@SaleDate GROUP BY Product .ProNO,ProName ,Price ) PRINT @MONEY GO --单元十二 触发器 --创建触发器,实现即更新每种产品的库存数量。 CREATE TRIGGER UPDATE_ProNo_Stocks_TRIGGER ON Product FOR UPDATE AS PRINT'已即更新每种产品的库存数量' GO --使用IF UPDATE(column)尽可能优化上题的触发器,以提高系统效率 ALTER TRIGGER UPDATE_ProNo_Stocks_TRIGGER ON Product FOR UPDATE AS IF UPDATE (ProNo) PRINT '已更新' GO --单元十三 游标 --创建存储过程P_SelProduct,逐行显示产品销售信息,内容包括编号、产品名称、销售日期、 --销售数量、销售金额、要求显示格式如下: --产品编号 产品名称 销售日期 销售数量 销售金额 --00001 电视 2006-1-1 10 30000 --产品编号 产品名称 销售日期 销售数量 销售金额 --00002 空调 2006-1-2 5 10000 CREATE PROCEDURE P_SelProduct AS DECLARE @ProNo NVARCHAR(5),@ProName nvarchar(20), @SaleDate DateTime,@Quantity Decimal(6,0), @SM Decimal(8,2) DECLARE CRS CURSOR FOR SELECT Product.ProNO,ProName,SaleDate,Quantity,SM=(Price*Quantity) FROM Product ,Proout WHERE Product .ProNO=Proout.ProNo ORDER BY SaleDate OPEN CRS FETCH NEXT FROM CRS INTO @ProNo,@ProName , @SaleDate,@Quantity ,@SM WHILE @@FETCH_STATUS =0 BEGIN PRINT '产品编号 产品名称 销售日期 销售数量 销售金额' PRINT @ProNo+' '+@ProName+' '+STR(YEAR(@SaleDate))+'-'+STR(MONTH(@SaleDate)) +'-'+STR(DAY(@SaleDate))+' '+@Quantity+' '+@SM+' ' FETCH NEXT FROM CRS INTO @ProNo,@ProName , @SaleDate,@Quantity , @SM END CLOSE CRS DEALLOCATE CRS t 扚 ]$ ]$ 晹轺褻蚅0! 17240671-14.2实训.sql [?灜? sql ?|--2018.4.18 USE master GO --单元五 创建于管理数据库 --创建数据库Sale CREATE DATABASE sale ON PRIMARY (NAME=sale, FILENAME='C:\\sale.mdf', SIZE=4MB, MAXSIZE=20MB, FILEGROWTH=1MB ) LOG ON (NAME=sale_log, FILENAME='C:\\sale_log.ldf', SIZE=10MB, MAXSIZE=20MB, FILEGROWTH=1MB) GO --向数据库增加文件组UserGroup ALTER DATABASE sale ADD FILEGROUP UserGroup GO ALTER DATABASE sale ADD FILE (NAME='sale_data3', FILENAME='D:\\sale_data3.ndf', SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=1MB ) TO FILEGROUP UserGroup GO sp_help sale GO USE master GO -- 单元六 创建于管理数据表 --创建客户表结构Customer CREATE TABLE Customer (CusNO nvarchar(3) NOT NULL, CusName nvarchar(10), Address nvarchar(20)NOT NULL, Tel nvarchar(20) NOT NULL) GO --创建场品表结构Product CREATE TABLE Product (ProNO nvarchar(5) NOT NULL, ProName nvarchar(20)NOT NULL, Price Decimal(8,2) NOT NULL, Stocks Decimal(6,0) NOT NULL) GO --创建入库表结构Proln CREATE TABLE Proln (InputDate DateTime NOT NULL, ProNo nvarchar(5) NOT NULL, Quantity Decimal(6,0) NOT NULL) GO --创建销售表结构Proout CREATE TABLE Proout (SaleDate DateTime NOT NULL, CusNo nvarchar(3) NOT NULL, ProNo nvarchar(5) NOT NULL, Quantity Decimal(6,0) NOT NULL, Amount Decimal(8,2)NOT NULL) GO --向已创建的表添加数据 INSERT Customer VALUES('001','杨婷','深圳','0755-22221111') INSERT Customer VALUES('002','陈萍','深圳','0755-22223333') INSERT Customer VALUES('003','李东','深圳','0755-22225555') INSERT Customer VALUES('004','叶合','广州','0755-22227777') INSERT Customer VALUES('005','谭新','广州','0755-22229999') Go INSERT Product VALUES('00001','电视',3000.00,800) INSERT Customer VALUES('00002','空调',2000.00,500) INSERT Customer VALUES('00003','床',1000.00,300) INSERT Customer VALUES('00004','餐桌',1500.00,200) INSERT Customer VALUES('00005','音响',5000.00,600) INSERT Customer VALUES('00006','沙发',6000.00,100) Go INSERT Proln VALUES('2006-1-1','00001',10) INSERT Proln VALUES('2006-1-1','00002',5) INSERT Proln VALUES('2006-1-2','00001',5) INSERT Proln VALUES('2006-1-2','00003',10) INSERT Proln VALUES('2006-1-3','00001',10) INSERT Proln VALUES('2006-2-1','00003',20) INSERT Proln VALUES('2006-2-2','00001',10) INSERT Proln VALUES('2006-2-3','00004',30) INSERT Proln VALUES('2006-3-3','00003',20) Go INSERT ProOut VALUES('2006-1-1','001','00001',10) INSERT ProOut VALUES('2006-1-2','001','00002',5) INSERT ProOut VALUES('2006-1-3','002','00001',5) INSERT ProOut VALUES('2006-2-1','002','00003',10) INSERT ProOut VALUES('2006-2-2','001','00001',10) INSERT ProOut VALUES('2006-2-3','001','00003',20) INSERT ProOut VALUES('2006-3-2','003','00001',10) INSERT ProOut VALUES('2006-3-2','003','00004',30) INSERT ProOut VALUES('2006-3-3','002','00003',20) Go --单元七 实施数据完整性(约束) --使用ALTER TABLE 语句为已经创建的表添加主键约束、外键约束 --主键 ALTER TABLE Customer ADD CONSTRAINT PK_Customer PRIMARY KEY(CusNo) GO ALTER TABLE Product ADD CONSTRAINT PK_Product PRIMARY KEY(ProNo) GO --外键 ALTER TABLE Proout ADD CONSTRAINT FK_Proout_Product FOREIGN KEY(ProNo) REFERENCES Product(ProNo) GO ALTER TABLE Proout ADD CONSTRAINT FK_Proout_Customer FOREIGN KEY(CusNo) REFERENCES Customer(Customer) GO ALTER TABLE Proln ADD CONSTRAINT FK_Proln_Product FOREIGN KEY(ProNo) REFERENCES Product(ProNo) GO --约束客户表Customer的CosNo的列值长度为3,产品表Product 的ProNo 列值长度为5 ALTER TABLE Coustomer ADD CONSTRAINT CK_Customer_CusNo CHECK (CusNo like '[0-9][0-9][0-9]') GO ALTER TABLE Product ADD CONSTRAINT CK_Product_ProNo CHECK(ProNo like'[0-9][0-9][0-9][0-9][0-9]') GO --对产品表Product 的Stocks列、Price列、入库表Proln的Quanity列、销售表ProOut 的Quanity --列值进行约束,使其值大于0 ALTER TABLE Product ADD CONSTRAINT CK_Product_Stock CHECK(Stock>0) GO ALTER TABLE Product ADD CONSTRAINT CK_Product_Price CHECK(Price>0) GO ALTER TABLE Proln ADD CONSTRAINT CK_Proln_Quantity CHECK (Quantity>0) GO ALTER TABLE ProOut ADD CONSTRAINT CK_ProOut_Quantity CHECK(Quantity>0) GO --对销售表ProOut的SaleDate 列进行约束,当不输入值,系统默认其值为系统当前日期 CREATE DEFAULT Today AS GETDATEA() GO /*ALTER TABLE ProOut ADD CONSTRAINT DF_ProOut_SaleDate DEFAULT('当前日期')FOR Date GO*/ --单元八 索引 --用户按照CusName查询客户信息,希望提高查询速度 CREATE UNIQUE INDEX IX_CusName ON Customer(CusName) GO --用户按照ProName查询产品信息,希望提高查询速度 CREATE UNIQUE INDEX IX_ProName ON Product(ProName) GO --用户按照SaleDate查询产品信息,希望提高查询速度 CREATE UNIQUE INDEX IX_SaleDate ON ProOut(SaleDate) GO --单元九 语言编程基础 --计算有多少种产品(假设为x),然后显示一条信息:共有X种产品 DECLARE @X int SET @X =(SELECT COUNT (*) FROM Product ) PRINT '共有'+convert (char(2),@x)+'种产品。' GO --编写计算n!(n=20)的程序,并显示结果。 DECLARE @X int,@product int SELECT @X=1,@product=1 WHILE @X<=20 BEGIN SELECT @X=@X+1 SELECT @product=@product*@X END SELECT '1*2*3*......*20的积'=@product GO --单元十 创建于管理视图 --创建视图V_Sale1,并显示销售日期、客户编号、客户姓名、产品编号、产品名称、单价 --销售数量、销售金额 CREATE VIEW V_Sale1 AS SELECT SaleDate,Customer.CusNO,CusName,Product.ProNO,ProName,Price,Proout.Quantity, SM=(Price *Proout.Quantity) FROM Customer ,Product,Proln,Proout WHERE Customer.CusNO=Proout.CusNo AND Product.ProNO=Proln.ProNo AND Product.ProNO=Proout.ProNo AND Proout.Quantity=Proln.Quantity GO --创建视图V-Sale2,统计每种产品的销售数量和销售金额。统计结果包括产品编号、 --产品名称、单价、销售数量和销售金额 CREATE VIEW V_Sale2 AS SELECT Product.ProNO ,ProName,Price,Proout.Quantity ,SM=(Price *Proout.Quantity) FROM Product ,Proout ,Proln GROUP BY ProName GO --创建视图V_Sale3,统计销售金额在10万以下的产品信息。 CREATE VIEW V_Sale3 AS SELECT Product.ProNO ,Product.ProName FROM Product ,Proout WHERE Product.ProNO=Proout.ProNo GROUP BY Product.ProNO,ProName HAVING SUM (Price*Quantity)<100000 GO --单元十一 创建管理存储过程 --创建存储过程P_Sale1,统计每种产品的销售数量和销售金额 CREATE PROCEDURE P_Sale1 AS SELECT Product.ProNO,ProName ,Price ,SUM(Quantity),SM=SUM(Price*Quantity) FROM Proout,Product WHERE Product.ProNO=Proout.ProNo GROUP BY Product .ProNO,ProName,Price GO --创建存储过程P_Sale2,能够根据指定客户统计,汇总该客户购买每种产品的数量和花费金额 CREATE PROCEDURE P_Sale2 @CusNo nvarchar(3) AS SELECT Product.ProNO,ProName,Price ,SUM(Quantity),SUM(Price*Quantity) FROM Product,Proout WHERE CusNO=@CusNO AND Product.ProNO=Proout.ProNo GROUP BY Product .ProNO,ProName ,Price GO --创建存储过程P_Sale3,能够根据指定的产品编号和日期,以输出参数的形式得到该产品的销售金额 CREATE PROCEDURE P_Sale3 @ProNo nvarchar(5),@SaleDate DateTime,@MONEY Decimal(8,2)OUTPUT AS SET @MONEY=( SELECT SUM(Price*Quantity) FROM Proout,Product WHERE Product.ProNO=Proout.ProNo AND Product.ProNO=@ProNo AND SaleDate =@SaleDate GROUP BY Product .ProNO,ProName ,Price ) PRINT @MONEY GO --单元十二 触发器 --创建触发器,实现即更新每种产品的库存数量。 CREATE TRIGGER UPDATE_ProNo_Stocks_TRIGGER ON Product FOR UPDATE AS PRINT'已即更新每种产品的库存数量' GO --使用IF UPDATE(column)尽可能优化上题的触发器,以提高系统效率 ALTER TRIGGER UPDATE_ProNo_Stocks_TRIGGER ON Product FOR UPDATE AS IF UPDATE (ProNo) PRINT '已更新' GO --单元十三 游标 --创建存储过程P_SelProduct,逐行显示产品销售信息,内容包括编号、产品名称、销售日期、 --销售数量、销售金额、要求显示格式如下: --产品编号 产品名称 销售日期 销售数量 销售金额 --00001 电视 2006-1-1 10 30000 --产品编号 产品名称 销售日期 销售数量 销售金额 --00002 空调 2006-1-2 5 10000 CREATE PROCEDURE P_SelProduct AS DECLARE @ProNo NVARCHAR(5),@ProName nvarchar(20), @SaleDate DateTime,@Quantity Decimal(6,0), @SM Decimal(8,2) DECLARE CRS CURSOR FOR SELECT Product.ProNO,ProName,SaleDate,Quantity,SM=(Price*Quantity) FROM Product ,Proout WHERE Product .ProNO=Proout.ProNo ORDER BY SaleDate OPEN CRS FETCH NEXT FROM CRS INTO @ProNo,@ProName , @SaleDate,@Quantity ,@SM WHILE @@FETCH_STATUS =0 BEGIN PRINT '产品编号 产品名称 销售日期 销售数量 销售金额' PRINT @ProNo+' '+@ProName+' '+STR(YEAR(@SaleDate))+'-'+STR(MONTH(@SaleDate)) +'-'+STR(DAY(@SaleDate))+' '+@Quantity+' '+@SM+' ' FETCH NEXT FROM CRS INTO @ProNo,@ProName , @SaleDate,@Quantity , @SM END CLOSE CRS DEALLOCATE CRS GO --单元十四 事务与锁 --1、一般情况下,只有当产品有足够的库存才允许销售该产品。创建一事务,实现当向Proout(销售)表插入新的数据行,如果 --Stock(库存数)大于Quantity(销售数量),则允许销售,否则拒绝销售。 CREATE PROCEDURE P1 @SaleDate DateTime , @CusNo nvarchar(3), @ProNo nvarchar(5), @Quantity Decimal(6,0) AS BEGIN TRANSACTION INSERT Proout(SaleDate,CusNo,ProNo,Quantity) VALUES(@SaleDate ,@CusNo ,@ProNo,@Quantity ) DECLARE @CountNum INT SET @CountNum =(SELECT Stocks FROM Product WHERE ProNo=@ProNo)-(SELECT SUM(Quantity) FROM Proout WHERE ProNo=@ProNo) IF @CountNum<0 BEGIN ROLLBACK TRANSACTION PRINT '库存数量小于销售数量,拒绝销售。' END ELSE BEGIN COMMIT TRANSACTION PRINT '销售成功!' END GO --测试 INSERT INTO Proout VALUES('2016-6-1','002','000001',900) GO --2、不用触发器,用事务的方式实现:当产品入库和销售能保证库存数量的准确性。谈谈你对触发器实现和使用事务实现的理解 t ? + + G鹙坺BwL0 17240671-2.sql 饌? --2018年3月14日 USE Xk GO --查询“00000001”同学是否报了“003”课程 SELECT * From StuCou where StuNo='00000001' and CouNo='003' GO --查询报名人数在15-40范围内的课程信息 SELECT * FROM Course WHERE WillNum>=15 AND WillNum<=40 GO --Between...and... SELECT * FROM Course WHERE WillNum BETWEEN 15 AND 40 GO --查询课程编号分别为"004"、"007"、"013"的课程信息(理解or) SELECT * FROM Course WHERE CouNo='004' or CouNo='007' or CouNo='013' GO --in的用法 SELECT * FROM Course WHERE CouNo IN ('004','007','013') GO --查询课程编号分别不为"004"、"007"、"013"的课程信息(not) SELECT * FROM Course WHERE CouNo NOT IN ('004','007','013') GO --查询课程信息、报名人数占限选人数之比(表达式作为列) SELECT * , WillNum/LimitNum AS '报名人数占限选人数之比' FROM Course GO --补充问题:小数点只保留2位(convert()函数、cast()函数) SELECT * ,convert (decimal(4,2),WillNum/LimitNum) AS '报名人数占限选人数之比' FROM Course GO SELECT * ,cast (WillNum/LimitNum as decimal(4,2)) AS '报名人数占限选人数之比' FROM Course GO --查询课程信息、报名人数占限选人数之比(升ASC、降DESC 序) SELECT * ,cast (WillNum/LimitNum as decimal(4,2)) AS '报名人数占限选人数之比' FROM Course ORDER BY WillNum DESC GO --查询课程信息、报名人数占限选人数之比以降序排列并查询前10行(前10%) SELECT top 10 * ,cast (WillNum/LimitNum as decimal(4,2)) AS '报名人数占限选人数之比' FROM Course ORDER BY WillNum DESC GO --查询选修课的任课教师名、课程号、课程名。要求教师名降序排列,教师名相同,按课程号的升序排列 SELECT teacher as '教师名',CouNo as '课程号',CouName as '教程名' FROM Course ORDER BY Teacher DESC,CouNo ASC GO --查询课程信息,要求查询结果为(在查询结果中增加字符串) SELECT '课程编码'=CouNO,'课程名称为:','课程名称'=CouName FROM Course GO --查询带有‘制作’课程 SELECT '课程编码'=CouNO,'课程名称为:','课程名称'=CouName FROM Course WHERE CouName LIKE '%制作%' GO -2018年3月17日 USE Xk GO 查询选课表中随机数无值的数据行 SELECT * FROM StuCou WHERE RandomNum IS NULL GO SELECT * FROM Course GO --查看选课表有多少门课程 --COUNT函数 SELECT COUNT(*)AS '课程总门数' FROM Course GO SELECT COUNT(CouNo)AS '课程总门数' FROM Course GO SELECT COUNT(*)FROM StuCou GO SELECT COUNT(RandomNum) FROM StuCou GO SELECT COUNT(Kind)AS '课程总门数' FROM Course GO --t ? ? ? 广~燪uL0 17240671-3.sql 餷wY--2018-3-21 USE Xk GO --1.平均 SELECT AVG(*)FROM Cours GO --2 SELECT Coure(*)FROM Student GO --3 --4 SELECT COUNT(DITINCT Kind) FROM Course FROM Course GO --5按照课程类别分组统计各类课程的门 SELECT Kind AS '课程种类',COUNT(Kind) AS '该种类的课程' FROM Course GROUP BY Kind GO --6 SELECT MIN(willNum) as'最报名人',MAX(willNum) as '最多报名人' FROM Course WHERE willNum >15 GROUP By Kind --7 SELECT Kind,AVG(WillNum) FROM Course WHERE WillNum>15 GROUP BY Kind HAVING AVG(WillNum)>30 GO --8 SELECT Kind,AVG(WillNum) FROM Coure WHERE Kind IN('管理')OR Kind GROUP BY ALL Kind GO SELECT * FROM Course COMPUTE By DepartNo COMPUTE AVG(WillNum) By DepartNo GO甬t ? O O 泎蝼P|L0 17240671-4.sql 餺9?-2018年3月28日 USE Xk GO --4, SELECT Student.StuNo,StuName,Course,CouNo,CouName,Credit FROM Student Course,StuCou WEHERE Student.StuNo = StuCou.StuNo AND COurse.CouNo.CouNo ORDER BY CouName,Student.StuNo GO --方法2 SELECT Student.StuNo,StuName,Course,CouNo,CouName,Credit FROM Student JOIN StuCou ON Student.StuNo = StuCou.StuNo JOIN Course ON Course CouNo = StuCou.StuNo ORDER BY CouName,Student.StuNo GO /*--查询同学报名‘计算机应用工工程系’选修课程的情况,显示信息包括:学号,姓名,课程编号,课程名,教师,上课间,按照课程编号排序, 课程编号相同,按照学号排序*/ SELECT Student.StuNo,StuName,CouNo,CouName,Teacher,ScoolTime FROM Student,Course,StuCou WHERE Student.StuNo=StuCou.StuNo AND Course=StuCou.CouNo AND DepartName='计算机工程系' AND Department.DepartNo=Course.DepartNo ORDER BY Course.CouNo,Student.StuNo GO --修改使用别名完成上题 SELECT Student.StuNo,StuName,CouNo,CouName,Teacher,ScoolTime FROM Student JOIN StuCou SC ON S.StuNo = SC.StuNo JOIN Course C ON C.CouNo = SC.CouNo JOIN Department D ON D.DepartNo=C.DepartNo WHERE DepartName='计算机工程系' ORDER BY C.CouNo,S.StuNo GO --练一练,查询各班同学的信息,要求显示,班级编号,班级名称,学号,姓名,按照班级编号排序,当班级编号相同,按照学号排序 --课本73页[2.35]查询每个班级可以选修的,不是自己所在系部开设的选修课程信息,显示信息包括班级,课程名,课程种类, --学分,老师,上课间和报名人数。 SELECT '班级编号'=ClassNo'班级名称','课程名'=CouName,'课程种类'=Kind,'学分'=Credit,'老师'=Teacher,'上课间'=ScoolTime, '报名人数'=WillNum FROM Class,Course WHERE Class.DepartNo<>Course.DEpartNo GO --课本73页[2.36] --查询课程类别相同但开课系部不同的课程信息,要求显示课程编号,课程名称,课程类别,系部编号,按照课程编号升序排序 SELECT '课程编号'=C1.CouNo,'课程名称'=C1.CouName,'课程类别'=C1.Kind,'系部编号'=C1.DepartNo FROM Course C1,Course C2 WHERE C1,Kind=C2.Kind AND C1.DepartNo<>C2.DEpartNo ORDER BY 课程编号 GO --外连接 --观察如下查询数据 --查询课程信息 SELECT CouNo,CouName,WillNum FROM Course ORDER BY CouNo GO --查询所有同学报名选修课的情况(包括有报名和没人报名),显示学号,姓名,课程号,课程名。 SELECT '学号'=CouNo,'姓名'=StuName,'课程号'=CouNo,'课程名'=CouName FROM Student,Course,StuCou WHERE Course.CouNo=StuCou.CouNo GO --丢失了没人报名的019课程,使用外连接信息丢失的问题 SELECT '学号'=StuNo,'姓名'=StuName,'课程号'=CouNo,'课程名'=CouName FROM Course LEFT JOIN StuCou /*左外连接,解决的是JOIN左面的表丢失的数据*/ ON Course.CouNo=StuCou.StuNo ORDER BY Course.CouNo GO --查询选修表信息 SELECT CouNo FROM StuCou ORDER BY CouNo GO`}t ? K K ?n⑾P凩0 17240671-5.sql 餹鱧--2018年4月4日 USE Xk GO --1,学号为'00000025'的学生第一志愿报名选修"001"课程.请在数据库中进行处理.(增加数据进StuCou表中) SELECT * FROM StuCou WHERE StuNo='00000025' GO INSERT StuCou(StuNo,CouNo,WillOrder,State) VALUES('00000025','001',1,'报名') GO --2,删除学号为'00000025'的学生的选修课报名信息。 DELETE StuCou WHERE StuNo='00000025' AND CouNo='01' GO UPDATE Course SET WillNum=WillNum-1 WHERE CouNo='001' --3,将"00多媒体"班的"杜晓静"的名字修改为"杜小静"。 UPDATE Student SET StuName='杜小静' FROM Student.Class WHERE StuName='杜晓静' AND ClassName='00多媒体' AND Student.ClassNo=Class.ClassNo --4,"00电子商务"班的"林斌"申请将已选修的"网络信息检索原理与技术"课程修改为"Linux操作系统". UPDATE StuCou SET CouNo = (SELECT CouNo FROM Course WHERE CouName = 'Linux操作系统') FROM StuCou,Class,Student,Course WHERE Class.Class Student.StuName = '林斌' AND CouName = '网络信息检索原理与技术' AND Class.ClassNo = Student.ClassNo AND Student.StuNo = StuCou.StuNo AND Name = '00电子商务' AND Course.CouNo = StuCou.CouNo 见t ? ? ? 剮L0 17240671-6-2.sql ?? USE master GO CREATE DATABASE Sale ON (NAME=Sale, FILENAME='E:\\Sale.mdf', SIZE=4, MAXSIZE=10, FILEGROWTH=1) LOG ON (NAME=Sale_log, FILENAME='F:\\Sale_log.ldf', SIZE=2, MAXSIZE=10, FILEGROWTH=1) GO USE Sale GO ALTER DATABASE Sale ADD FILEGROUP UserGroup GO USE master GO ALTER DATABASE Sale ADD FILE (NAME=Sale, FILENAME='E:\\Sale2.ndf', SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=1MB) TO FILEGROWOUP UserGroup GO SP_helpdb Sale GO?t ? ? ? ╡?WP扡0 17240671-7-1sql 餋嘵--2018年4月18日第七周 USE Xk GO ALTER DATABASE Xk ADD FILEGROUP TableGroup GO sp_helpfilegroup TableGroup GO USE Xk GO --创建班级信息表Class CREATE TABLE Class1 (ClassNo nvarchar (8) NOT NULL, ClassName nvarchar (20) NOT NULL, DepartNo nvarchar (2) NOT NULL) GO --创建学生信息表Student CREATE TABLE Student1 (StuNo nvarchar (8) NOT NULL, StuName nvarchar (10) NOT NULL, Pwd nvarchar (8) NOT NULL, ClassNo nvarchar (8) NOT NULL) GO --创建学生选课表StuCou CREATE TABLE StuCou1 (StuNo nvarchar (8) NOT NULL, CouNo nvarchar (3) NOT NULL, WillOrder smallint NOT NULL, State nvarchar (2) NOT NULL, RandomNum nvarchar (50) NULL) GO USE Xk GO ALTER TABLE Student ADD birthday datetime null,bz nvarchar(20) null GO USE Xk GO ALTER TABLE Student DROP COLUMN birthday GO USE Xk GO ALTER TABLE Student ALTER COLUMN bz nvarchar(30) null GO USE Xk GO sp_rename 'Student.bz','StuBz','COLUMN' GO 鮰 ? ? ? E諹wE汱0 17240671-7-2.sql ?_2 USE master GO CREATE DATABASE Sale ON (NAME=Sale, FILENAME='C:\\Sale.mdf', SIZE=4, MAXSIZE=10, FILEGROWTH=1) LOG ON (NAME=Sale_log, FILENAME='C:\\Sale_log.ldf', SIZE=2, MAXSIZE=10, FILEGROWTH=1) GO USE Sale CREATE TABLE Customer (CusNo nvarchar(3) NOT NULL, CusName nvarchar(10) NOT NULL, Address nvarchar(20) NULL, Tel nvarchar(20) NULL) GO CREATE TABLE Product (ProNo nvarchar(5) NOT NULL, ProName nvarchar(20) NOT NULL, Price Decimal(8,2) NOT NULL, Stocks Decimal(8,0) NOT NULL) GO CREATE TABLE Proln (InputDate DateTime NOT NULL, ProNo nvarchar(5)NOT NULL, Quantity Decimal(6,0)NOT NULL) GO CREATE TABLE ProOut (SaleDate DateTime NOT NULL, CusNo nvarchar(3)NOT NULL, ProNo nvarchar(5)NOT NULL, Quantity Decimal(6,0)NOT NULL) GO INSERT Customer VALUES ('001','杨婷','深圳','0755-22221111') INSERT Customer VALUES ('002','陈萍','深圳','0755-22223333') INSERT Customer VALUES ('003','李东','深圳','0755-22225555') INSERT Customer VALUES ('004','叶合','广州','0755-22225555') INSERT Customer VALUES ('005','谭新','广州','0755-22225555') GO INSERT Proln VALUES ('2006-1-1','00001','10') INSERT Proln VALUES ('2006-1-2','00002','5') INSERT Proln VALUES ('2006-1-3','00001','5') INSERT Proln VALUES ('2006-2-1','00003','10') INSERT Proln VALUES ('2006-2-2','00001','10') INSERT Proln VALUES ('2006-2-3','00003','10') INSERT Proln VALUES ('2006-3-2','00001','10') INSERT Proln VALUES ('2006-3-2','00004','30') INSERT Proln VALUES ('2006-3-3','00003','20') GO --添加主键约束,外键约束 ALTER TABLE Customer ADD CONSTRAINT PK_Customer PRIMARY KEY(CusNo) GO ALTER TABLE Product ADD CONSTRAINT PK_Product PRIMARY KEY(ProNo) GO ALTER TABLE Proln ADD CONSTRAINT PK_Proln PRIMARY KEY(ProNo) GO ALTER TABLE ProOut ADD CONSTRAINT PK_ProOut PRIMARY KEY(CusNo,ProNo) GO --运用检查约束 ALTER TABLE Product ADD CONSTRAINT CK_Stock CHECK(Stock>0) ALTER TABLE Product ADD CONSTRAINT CK_Price CHECK(Price>0) ALTER TABLE Proln ADD CONSTRAINT CK_Quantity CHECK(Quantity>0) ALTER TABLE ProOut ADD CONSTRAINT CK_Quantity CHECK(Quantity>0) GO --运用默认约束 ALTER TABLE ProOut ADD CONSTRAINT DF_ProOut_Saledate DEFAULT('当前日期')FOR Date GO?t ? ? ? €猳?Q㎜0 17240671.10.1.sql 皝?--2018-4-9日 编程基础 SELECT ClassNo From Xk..Class GO SELECT CLassNo FROM Xk.dbo.Class GO --T_sql语法元素:标识符(两种),局部变量,全局变量,数据类型 /* */ SELECT @@SERVERNAME SELECT @@MAX_CONNECTIONS SELECT @@LANGUAGE SELECT @@VERSION SELECT * FROM Xk..Student GO SELECT * FROM Class GO USE Xk SELECT * FROM Xk..Student GO USE Xk CREATE VIEW V TEST AS SELECT * FROM Student GO USE Xk GO CREATE VIEW V TEST AS SELECT * FROM Student GO DECLARE @iNUM INT SET @iNUM=5 PRINI @INUM --显示Course表中有多少类课程? SELECT COUNT(DISTINCT Kind)FROM Course GO --显示Course表中有多少类课程,要求将结果保存到一个局部变量中,并显示出来。 DECLARE @KindCount Tinyint SET @KindCount=(SELECT COUNT (DISTINCT Kind)FROM Course) PRINT @KindCount GO DECLARE @KindCount Tinyint SET @KindCount=(SELECT COUNT (DISTINCT Kind)FROM Course) PRINT 'Course表中有'+CONVERT (VARCHAR(3),@KindCount)+'类课程' GO --练一练:1,编写计算1+2+3+10000的和,并显示计算结果。 DECLARE @i int,@sum=0 SELECT @i=1,@sum=0 WHILE @i<=10000 BEGIN SELECT @sum=@sum+@i SELECT @i=@i+1 END SELECT'1+2+3+4+......+10000的和'=@sum GO --练一练:2,编写计算20!,并显示计算结果。 --练一练:3,@iNum1,@iNum2为两个整型变量,值分为76,90,编程显示两个变量中的较大者。 DECLARE @iNum1 int,@iNum2 int SELECT @iNum1=76,@iNum2=90 IF(@iNum1>@iNum2) PRINT @iNum1 ELSE PRINT @iNum2 GO]謙 ? ? ? ;砝blO獿0 17240671.10.2.sql 餹M--2018-05-11 DECLARE @iNum1 int,@iNum2 int SELECT @iNum1=79,@iNum2=90 if(@iNum1>@iNum2) PRINT @iNum1 else PRINT @iNum2 GO USE Xk GO SELECT '课程类别'=Kind,'分类的课程类别'= CASE Kind WHEN '工程技术'THEN'工科类课程' WHEN '人文'THEN'人文类课程' WHEN '信息技术'THEN '信息技术类课程' ELSE '其他类课程' END,'课程名称'=CouName,'报名人数'=WillNum FROM Course ORDER BY Kind,WillNum COMPUTE AVG(WillNum)BY Kind GO --问题9.13校长生日1979/12/23,使用日期函数显示校长年龄 SELECT '年龄'=DATEDIFF(YY,'1979/12/23',GETDATE()) GO --如果一个人的出生日期为1922/2/23,计算并显示目前总天数 SELECT '天数'=DATEDIFF(DD,'1922/2/23',GETDATE()) GO --问题9.26 CREATE FUNCTION CalcRemainNum (@X decimal(6,0),@Y decimal(6,0)) RETURNS decimal(6,0) AS BEGIN RETURN(@X-@Y) END GO ALTER TABLE Course ADD RemainNum AS dbo.CalcRemainNum(LimitNum,ChooseNum) GO SELECT *FROM Course GO  ? c c ?/fP癓0 17240671.10.4.sql 饃XK--2018-05-16 --创建一个名字为V_MyClass的视图。 CREATE VIEW V_MyClass AS SELECT StuNo,StuName,ClassName FROM Student,Class WHERE Student.ClassNo=Class.ClassNo GO --对视图可以像使用表一样操作。 --查看视图内容。 SELECT * FROM V_MyClass GO --查看视图的定义。 SP_HELPTEXT V_MyClass GO --修改视图,加密视图的定义。 ALTER VIEW V_MyClass WITH ENCRYPTION AS SELECT StuNo,StuName,ClassName FROM Student,Class WHERE Student.ClassNo=Class.ClassNo GO --查看视图的定义。 SP_HELPTEXT V_MyClass GO --显示"对象'V_MyClass'的文本已加密。" --重命名视图。 SP_RENAME 'V_MyCLass','V1_MyClass' GO --删除视图。 DROP VIEW V_MyClass GO SP_HELP GO --[问题10.1]修改试图列标题 --[问题10.6]注意视图中SELECT语句中必须有列名。 /* 综合练习:Teacher 是00多媒体班班主任,使该老师可以查看自己班级学生选课情况(学号,姓名,课程名,种类, 学分,上课间,开课习部) */ --步骤1:创建一个视图,显示'00多媒体'班同学的选课情况(学号,姓名,课程名,种类,学分,上课间,开课系部) CREATE VIEW V_TeacherLi AS SELECT Student,StuNo,StuName,CouName,Kind,Credit,ScoolTime,DepartName FROM Student,Course,StuCou,Class,Department WHERE Student.StuNo=StuCou.StuNo AND Course.CouNo=StuCou.CouNo AND Student.ClassNo=Class.Class.ClassNo AND Department.DepartNo=Course.DepartNo AND ClassName GO --步骤2;在SQL Server中为TeacherLi创建一个登录,登录名为:TeacherLi,登录密码为:TeacherLi USE master GO CREATE LOGIN TeacherLi WITH PASSWORD='TeacherLi' GO --测试:使用TeacherLi登录SQL Server,看是否可以登录成功? --可以登录成功。看不到Xk数据库数据。 --步骤3; USE Xk GO CREATE USER TeacherLi GO --测试:使用TeacherLi登录SQL Server,看是否可以登录成功? --可以点Xk,但是看不到用户表 --步骤4:授予TeacherLi可以看到视图V_TeacherLi USE Xk GO GRANT SELECT ON V_TeacherLi TO TeacherLi GO GRANT SELECT ON STUDENT TO TeacherLi GO 鏒t 扚 ? ? 侘絿禖睱0! 17240671.10.5实训.sql [?灜? sql 皭?--2018.4.18 USE master GO --创建数据库Sale CREATE DATABASE sale ON PRIMARY (NAME=sale, FILENAME='C:\\sale.mdf', SIZE=4MB, MAXSIZE=20MB, FILEGROWTH=1MB ) LOG ON (NAME=sale_log, FILENAME='C:\\sale_log.ldf', SIZE=10MB, MAXSIZE=20MB, FILEGROWTH=1MB) GO --向数据库增加文件组UserGroup ALTER DATABASE sale ADD FILEGROUP UserGroup GO ALTER DATABASE sale ADD FILE (NAME='sale_data3', FILENAME='D:\\sale_data3.ndf', SIZE=5MB, MAXSIZE=10MB, FILEGROWTH=1MB ) TO FILEGROUP UserGroup GO sp_help sale GO USE master GO --创建客户表结构Customer CREATE TABLE Customer (CusNO nvarchar(3) NOT NULL, CusName nvarchar(10), Address nvarchar(20)NOT NULL, Tel nvarchar(20) NOT NULL) GO --创建场品表结构Product CREATE TABLE Product (ProNO nvarchar(5) NOT NULL, ProName nvarchar(20)NOT NULL, Price Decimal(8,2) NOT NULL, Stocks Decimal(6,0) NOT NULL) GO --创建入库表结构Proln CREATE TABLE Proln (InputDate DateTime NOT NULL, ProNo nvarchar(5) NOT NULL, Quantity Decimal(6,0) NOT NULL) GO --创建销售表结构Proout CREATE TABLE Proout (SaleDate DateTime NOT NULL, CusNo nvarchar(3) NOT NULL, ProNo nvarchar(5) NOT NULL, Quantity Decimal(6,0) NOT NULL, Amount Decimal(8,2)NOT NULL) GO --向已创建的表添加数据 INSERT Customer VALUES('001','刘星','深圳','0755-22221111') INSERT Customer VALUES('002','陈笃','深圳','0755-22223333') INSERT Customer VALUES('003','李耳','深圳','0755-22225555') INSERT Customer VALUES('004','苏岩','广州','0755-22225555') INSERT Customer VALUES('005','赵颖','广州','0755-22225555') Go INSERT Customer VALUES('0001','电视','3000.00','800') INSERT Customer VALUES('0002','空调','2000.00','500') INSERT Customer VALUES('0003','床','1000.00','300') INSERT Customer VALUES('0004','餐桌','1500.00','200') INSERT Customer VALUES('0005','音响','5000.00','600') INSERT Customer VALUES('0006','沙发','6000.00','100') Go INSERT Proln VALUES('2006-1-1','00001','10') INSERT Proln VALUES('2006-1-2','00002','5') INSERT Proln VALUES('2006-1-3','00001','5') INSERT Proln VALUES('2006-2-1','00003','10') INSERT Proln VALUES('2006-2-2','00001','10') INSERT Proln VALUES('2006-2-3','00003','20') INSERT Proln VALUES('2006-3-2','00001','10') INSERT Proln VALUES('2006-3-2','00004','30') INSERT Proln VALUES('2006-3-3','00003','20') Go INSERT ProOut VALUES('2006-1-1','001','00001','10','5000') INSERT ProOut VALUES('2006-1-2','001','00002','5','4000') INSERT ProOut VALUES('2006-1-3','002','00001','5','7000') INSERT ProOut VALUES('2006-2-1','002','00003','10','6000') INSERT ProOut VALUES('2006-2-2','001','00001','10','4000') INSERT ProOut VALUES('2006-2-3','001','00003','20''6000') INSERT ProOut VALUES('2006-3-2','003','00001','10','5500') INSERT ProOut VALUES('2006-3-2','003','00004','30') INSERT ProOut VALUES('2006-3-3','002','00003','20') Go --使用ALTER TABLE 语句为已经创建的表添加主键约束、外键约束 ALTER TABLE Customer ADD CONSTRAINT PK_Customer PRIMARY KEY(CusNo) GO ALTER TABLE Product ADD CONSTRAINT PK_Product PRIMARY KEY(ProNo) GO ALTER TABLE Proln ADD CONSTRAINT PK_Proln PRIMARY KEY(ProNo) GO ALTER TABLE ProOut ADD CONSTRAINT PK_ProOut PRIMARY KEY(CusNO,ProNo) GO --约束客户表Customer的CosNo的列值长度为3,产品表Product 的ProNo 列值长度为5 ALTER TABLE Coustomer ADD CONSTRAINT CK_CusNo CHECK (CusNo like '[0-9][0-9][0-9]') GO ALTER TABLE Product ADD CONSTRAINT CK_ProNo CHECK(ProNo like'[0-9][0-9][0-9][0-9][0-9]') GO --对产品表Product 的Stocks列、Price列、入库表Proln的Quanity列、销售表ProOut 的Quanity --列值进行约束,使其值大于0 ALTER TABLE Product ADD CONSTRAINT CK_Stock CHECK(Stock>0) ALTER TABLE Product ADD CONSTRAINT CK_Price CHECK(Price>0) ALTER TABLE Proln ADD CONSTRAINT CK_Quantity CHECK (Quantity>0) ALTER TABLE ProOut ADD CONSTRAINT CK_Quantity CHECK(Quantity>0) GO --对销售表ProOut的SaleDate 列进行约束,当不输入值,系统默认其值为系统当前日期 ALTER TABLE ProOut ADD CONSTRAINT DF_ProOut_SaleDate DEFAULT('当前日期')FOR Date GO --用户按照CusName查询客户信息,希望提高查询速度 CREATE UNIQUE INDEX IX_CusName ON Customer(CusName) GO --用户按照ProName查询产品信息,希望提高查询速度 CREATE UNIQUE INDEX IX_ProName ON Product(ProName) GO --用户按照SaleDate查询产品信息,希望提高查询速度 CREATE UNIQUE INDEX IX_SaleDate ON ProOut(SaleDate) GO --计算有多少种产品(假设为x),然后显示一条信息:共有X种产品 DECLARE @X int SET @X =(SELECT COUNT (*) FROM Product ) PRINT '共有'+convert (char(2),@x)+'种产品。' GO --编写计算n!(n=20)的程序,并显示结果。 DECLARE @X int,@product int SELECT @X=1,@product=1 WHILE @X<=20 BEGIN SELECT @X=@X+1 SELECT @product=@product*@X END SELECT '1*2*3*......*20的积'=@product GO --创建视图V_Sale1,并显示销售日期、客户编号、客户姓名、产品编号、产品名称、单价 --销售数量、销售金额 CREATE VIEW V_Sale1 AS SELECT SaleDate,Customer.CusNO,CusName,Product.ProNO,ProName,Price,Proout.Quantity, COUNT (*)Amount FROM Customer ,Product,Proln,Proout WHERE Customer.CusNO=Proout.CusNo AND Product.ProNO=Proln.ProNo AND Product.ProNO=Proout.ProNo AND Proout.Quantity=Proln.Quantity GO --创建视图V-Sale2,统计每种产品的销售数量和销售金额。统计结果包括产品编号、 --产品名称、单价、销售数量和销售金额 CREATE VIEW V_Sale2 AS SELECT Product.ProNO ,ProName,Price,Proout.Quantity ,COUNT(*)AMOUNT FROM Product ,Proout ,Proln GROUP BY ProName GO --创建视图V_Sale3,统计销售金额在10万以下的产品信息。 CREATE VIEW V_Sale3 AS SELECT Product.ProNO ,Product.ProName FROM Product ,Proout WHERE Product.ProNO=Proout.ProNo GROUP BY Product.ProNO,ProName HAVING SUM (Price*Quantity)<100000 GO &鉻 ? 鎼?跴睱0 17240671.10.6.sql 鹦?--2018-5-18 第11周周五 --存储过程 --[问题11.1],[问题11.2] USE Xk GO CREATE PROCEDURE P_Student AS SELECT * FROM Student WHERE ClassNo='20000001' GO --执行存储过程 P_Student GO --查看存储过程 SP_HELP P_Student GO SP_HELPTEXT P_Student GO SP_DEPENDS P_Student GO CREATE PROCEDURE P_StudentPara @ClassNo nvarchar(8) AS SELECT * FROM Student WHERE ClassNo=@ClassNo GO EXEC P_StudentPara '20000001' GO --[问题11.4] --问题:带参数的存储过程传递参数有几种方式? --如何创建和执行带输出参数的存储过程?[问题11.7] EXEC P_StudentPara @ClassNo='20000001' GO EXEC P_StudentPara @ClassNo='20000002' GO CREATE PROCEDURE P_ClassNum @ClassNo nvarchar (8),@ClassNum smallint OUTPUT AS SET @ClassNum= ( SELECT COUNT(*)FROM Student WHERE ClassNo=@ClassNo=@ClassNo ) PRINT @ClassNum GO DECLARE @ClassNo nvarchar (8),@ClassNum smallint SET @ClassNo='20000001' EXEC P_ClassNum @ClassNo,@ClassNum OUTPUT SELECT @ClassNum GO ALTER PROCEDURE P_StudentPara @ClassName nvarchar(20) WITH ENCRYPTION AS SELECT ClassName,StuNo,StuName,Pwd FROM Student,Class WHERE Student.ClassNo=Class.ClassNo AND ClassName LIKE '%'+@ClassName+'%' GO USE master GO XP_LOGINCONFIG GO XP_CMDSHELL 'DIR D:\*.*' GO 挌t ? ? ? RE粣甈筁0 17240671.12.1.sql 養--2018年5月25日 --12.1创建触发器Update_Student_Trigger,实现每当修改Student表中的数据,在客户端显示"已修改Student表的数据。"的消息。 USE Xk GO CREATE TRIGGER Update_Student_Trigger ON Student FOR UPDATE AS PRINT'已修改Student表的数据。' GO UPDATE Student SET Pwd='11111111' WHERE StuNo='00000001' --12.2修改触发器Update_Student_Trigger,在确实修改了Student表中的数据后返回"已修改Student表的数据。",否则返回"不存在要修改的数据。"。 USE Xk GO ALTER TRIGGER Update_Student_Trigger ON Student FOR UPDATE AS IF(SELECT COUNT(*) FROM inserted)<>0 PRINT'已修改 Student 表的数据。' ELSE PRINT '不存在要修改的数据。' GO --12.4创建替代触发器UPDATE_Department_Trigger,修改Department表的数据触发器发器,用执行触发器中的语句替代触发的SQL语句。 USE Xk GO CREATE TRIGGER UPDATE_Department_Trigger ON Department INSTEAD OF UPDATE AS PRINT'实际上并没有修改Department表中的数据。' GO UPDATE Department SET DepartName='软件工程系'WHERE DepartNo='01' --12.5创建一个触发器,当插入,更新或删除StuCou表的选课数据行,能同更新Course表中相应的报名人数。 USE Xk GO CREATE TRIGGER SetWillNum ON StuCou FOR INSERT,UPDATE,DELETE AS UPDATE Course SET WillNum=WillNum+1 WHERE CouNo=(SELECT CouNo FROM INSERTED) UPDATE Course SET WillNum=WillNum-1 WHERE CouNo=(SELECT CouNo FROM DELETED) PRINT '已自动更新Course 表中相应课程的报名人数。' GO SELECT * FROM Course WHERE CouNo='002' SELECT * FROM Course WHERE CouNo='003'|鵷 ? 魸儕擯綥0 17240671.13.1.sql 鹭贒--2018-05-30 USE Xk GO SELECT * FROM Student WHERE StuName LIKE '张%' GO --创建一个游标,逐渐显示姓张同学的信息 --步骤1:声明游标 DECLARE CUR_StuName CURSOR FOR SELECT * FROM Student WHERE StuName LIKE '张%' GO --打开游标 OPEN CUR_StuName --显示游标位置的数据行 FETCH CUR_StuName WHILE @@FETCH_STATUS=0 FETCH CUR_StuName GO SELECT @@FETCH_STATUS --关闭游标 CLOSE CUR_StuName --释放游标 DEALLOCATE CUR_StuName GO --任意给出学号,然后允许修改名字。使用游标完成。 CREATE PROCEDURE P_StuName @StuNo nvarchar(8),@StuName nvarchar(10) AS --用来接收FETCH的数据行 DECLARE @StuNo nvarchar(8),@StuName nvarchar(10),@ClassNo nvarchar(8),@Pwd nvarchar(8) --声明游标 DECLARE CUR_StuName CURSOR FOR SELECT * FROM Student --打开游标 OPEN CUR_StuName --FETCH游标位置的数据到4个变量里 FETCH CUR_StuName INTO @StuNo,@StuName,@ClassN0,@Pwd WHILE @@FETCH_STATUS=0 BEGIN IF(@StuNo=@InputStuNo) UPDATE Student SET StuName=@InputStuName WHERE CURRENT OF CUR_StuName FETCH CUR_StuName INTO @StuNo,@StuName,@ClassNo,@Pwd END --关闭游标 CLOSE CUR_StuName --释放游标 DEALLOCATE CUR_StuName GO --执行,将'00000046' '张峰'名字改为'张锋' P_StuName '00000046','张锋' GO g豻 ? ` ` )锋?P芁0 17240671.14.1.sql 版蕂--2018-06-06 USE Xk GO --开始事务,一个学生报3门课 BEGIN TRANSACTION INSERT StuCou(StuNo,CouNo,WillOrder,State) VALUES ('00000025','001',1) INSERT StuCou(StuNo,CouNo,WillOrder,State) VALUES ('00000025','002',2) INSERT StuCou(StuNo,CouNo,WillOrder,State) VALUES ('00000025','003',3) --提交事务,保存在StuCou表中 COMMIT TRANSACTION SELECT * FROM StuCou WHERE StuNo='00000025' GO BEGIN TRANSACTION INSERT StuCou(StuNo,CouNo,WillOrder,State) VALUES ('00000025','001',1,'报名') INSERT StuCou(StuNo,CouNo,WillOrder,State) VALUES ('00000025','002',2,'报名') INSERT StuCou(StuNo,CouNo,WillOrder,State) VALUES ('00000025','003',3,'报名') --撤销事务,撤销刚插入的3行数据 ROLLBACK TRANSACTION SELECT * FROM StuCou WHERE StuNo='00000025' GO USE Xk GO BEGIN TRANSACTION --报3门课程 INSERT StuCou(StuNo,CouNo,WillOrder) VALUES ('00000025','001',1) INSERT StuCou(StuNo,CouNo,WillOrder) VALUES ('00000025','002',2) INSERT StuCou(StuNo,CouNo,WillOrder) VALUES ('00000025','003',3) DECLARE @CountNum INT SET @CountNum=(SELECT COUNT(*)FROM StuCou WHERE StuNo='00000025') IF @CountNum>3 BEGIN ROLLBACK TRANSACTION PRINT '报名的课程超过所规定的3门,所以报名无效。' END ELSE BEGIN COMMIT TRANSACTION PRINT '恭喜,选修课程报名成功!' END --测试 SELECT *FROM StuCou WHERE StuNo='00000025' --删除 DELETE FROM StuCou WHERE StuNo='00000025'?t ? ? ? ??諴萀0 17240671.14.2.sql ?螶USE Xk GO EXEC sp_lock GO USE Xk SET DEADLOCK_PRIORITY LOW BEGIN TRANSACTION --事务中,系统自动为Student表中StuNo='0000001'的数据行加锁 UPDATE Student SET Pwd='1111111' WHERE StuNo='00000001' GO USE Xk GO --事务中,系统自动为Course表中CouNo='002'的数据行加锁 UPDATE Course SET Credit=4 WHERE CouNo='002' GO SET LOCK_TIMEOUT 1800 /*将锁超限设置为1800毫秒*/ GO SELECT @@LOCK_TIMEOUT GO USE master GO ?t ? ?I吢P橪0 17240671.8-1.sql 痧u--2018年-04月-25日 --检查约束: USE Xk GO ALTER TABLE Student ADD CONSTRAINT CK_StuNo CHECK (StuNo like'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' AND StuNo<>'00000000') GO --问题[7.14] USE Xk GO ALTER TABLE Student DROP CONSTRAINT CK_StuNo GO ALTER TABLE StuCou ADD CONSTRAINT CK_WillOrder CHECK (WillOrder IN(1,2,3,4,5)) GO USE Xk GO ALTER TABLE StuCou ADD CONSTRAINT DF_StuCou_State GO USE Xk GO --创建名为UnsureDefault的默认值 CREATE DEFAULT UnsureDefault AS'待定' GO --将默认值UnsureDefault 绑定到 Course表的 Teacher列上 EXEC sp_bindefault,'Course.Teacher' GO --创建book表 USE Xk GO CREATE TABLE book ( bookID int IDENTITY(1,1), bookName varchar(30) NOT NULL ) GO --输入行数据,只输入BookName列值,标识列bookID由系统自动生成 INSERT book(bookName) VALUES('计算机网络技术') INSERT book(BookName) VALUES('软件测试技术') INSERT book(BookName) VALUES('动态WEB技术') GO --显示book表信息 SELECT * FROM book GO 暐t ? 6 6 洰澥P汱0 17240671.8.2.sql 安淣USE Xk GO CREATE UNIQUE INDEX IX_CouName ON Course (CouName) GO --2,将Student表的IX_StuName引重命名为IX_StuNameNew USE Xk GO EXEC sp_rename 'Student.IX_StuName','IX StuNameNew' GO --3,删除Course表上名字为IX_CouName的索引。 USE Xk GO DROP INDEX Course.IX_CouName GO --4,在Xk数据中的Student表上查询姓“林”学生的信息,并分析哪些索引被系统采用。 USE Xk GO SET SHOWPLAN_ALL ON; GO SELECT StuNo,StuName FROM Student WHERE StuName LIKE '林%' GO SET SHOWPLAN_ALL OFF; GO --5,在Xk数据库中的Student表上查询学号为“00000001”的学生信息,并分析哪些索引被系统采用。 USE Xk GO SET SHOWPLAN_ALL ON; GO SELECT StuNo FROM Student WHERE StuNo='00000001' GO SET SHOWPLAN_ALL OFF; GO --6,在Xk数据库中的Student表上查询姓名为“林斌”的学生信息,并分析执行该数据查询所花费的磁盘活动量信息。 USE Xk GO SET STATISICS IO ON GO SELECT * FROM Student WHERE StuName='林斌' GO SET STATISICS IO OFF GO --7,使用UPDATE STATISTICS语句更新Xk数据库中的Student表的PK_Student索引的统计信息。 USE Xk GO UPDATE STATISTICS Student PK_Student GO ?{ @ 课后实训
按照上面创建视图的方法将下面两个表创建一个试图表:VW_BILL_OUT_MT_BY_DT(出库单) BILL_OUT_MT(出库单主表) ColumnName ID PK Nullable DataType Default Comments BILL_OUT_MT_ID 1 1 N NUMBER(10,0) 出库订单ID BILL_OUT_MT_NO 2 N VARCHAR2(20) 出库单编号 BILL_OUT_TYPE 3 Y VARCHAR2(20) 单据类型 BILL_OUT_STGE_WIP-原料调拨出库 BILL_OUT_OTOUT_WIP-原料其它出库 BILL_OUT_PORET_WIP-原料采购退货 BILL_OUT_LEND_WIP-原料借换单 BILL_OUT_PD_WIP-原料生产出库 BILL_OUT_SAL_FG-成品销售出库 BILL_OUT_PDRET_FG-成品生产退回 BILL_OUT_RZJS_FG-成品技术领料(认证)出库 BILL_OUT_OTOUT_FG-成品其它出库 BILL_OUT_PORET_FG-成品采购退货 CUSTOMER_ID 4 Y VARCHAR2(20) 客户ID FROM_ERP 5 N NUMBER(1,0) 1 是否ERP导入(0:WMS自建 1:ERP导入) SHIP_LC 6 Y VARCHAR2(20) 集货货位 BILL_OUT_MT_ST 7 N VARCHAR2(10) '0' 出库单状态(0-初始 1-执行 3-出库中 4-出库完成 5-发运完成 9-已撤销) CREATE_USER_ID 8 Y NUMBER(10,0) 生成用户 CREATE_DATE 9 Y DATE SYSDATE 生成日期 CREATE_MODULE_ID 10 Y VARCHAR2(50) 生成模块 UPDATE_USER_ID 11 Y NUMBER(10,0) 更新用户 UPDATE_DATE 12 Y DATE SYSDATE 更新日期 UPDATE_MODULE_ID 13 Y NUMBER(10,0) 更新模块 COMMENTS 14 Y VARCHAR2(200) 备注 MOVEMENT_TYPE 15 Y VARCHAR2(20) 移动类型 TRANSACTION_ID 16 Y VARCHAR2(20) SAP业务类型 IS_PRE_OUT 17 Y NUMBER(1,0) 0 是否备货(0-否 1-是) DEF_STN_NO 18 Y VARCHAR2(30) 出库站台 TXT_FILE_NAME 19 Y VARCHAR2(50) 文件名称 IS_MARKS 20 Y NUMBER(3,0) 0 打印唛头标志(0-未打印 >=1-打印次数) STATE 21 Y VARCHAR2(10) 0 审核状态(0:初始 1:已审核) SYSTEM_FROM 22 Y VARCHAR2(20) 所对应系统(NC/U8) WERKS 23 Y VARCHAR2(20) 工厂PK CDEPCODE 24 Y VARCHAR2(24) 部门 WH_ID 25 Y NUMBER(10,0) 仓库ID REVIEWER_ID 26 Y NUMBER(10,0) 审核人 REVIEW_DATE 27 Y DATE 审核日期 BUSINESS_NO 28 Y VARCHAR2(20) 业务编号(借换单使用,来源于系统参数) DOC_TYPE 29 Y VARCHAR2(20) 借换单类别(借换单使用,来源于系统参数,借料/换货) 手动转仓单(直接填MANUAL_TRANSFER,单据类别为原料其他出库) TO_WH_ID 30 Y NUMBER(10,0) 目标仓库ID CONFIRM_ID 31 Y NUMBER(10,0) 确认人 CONFIRM_DATE 32 Y DATE 确认日期 FINISH_ID 33 Y NUMBER(10,0) 完成人 FINISH_DATE 34 Y DATE 完成日期 SUPPLIER_ID 35 Y VARCHAR2(20) 供应商ID IPERTAXRATE 36 Y NUMBER(13,0) 税率 IEXCHRATE 37 Y NUMBER(8,0) 汇率 CEXCH_NAME 38 Y VARCHAR2(16) 币种名称 BILL_OUT_DT(出库单明细表) ColumnName ID PK Nullable DataType Default Comments BILL_OUT_DT_ID 1 1 N NUMBER(10,0) 出库单明细ID BILL_OUT_MT_ID 2 Y NUMBER(10,0) 出库单ID SAP_OUT_MT_NO 3 Y VARCHAR2(20) 特殊库存对应单号(SAP销售单号) SAP_OUT_DT_NO 4 Y VARCHAR2(20) 特殊库存对应单行项目号(SAP销售单行项目号) ITEM_ID 5 N VARCHAR2(100) 物品ID IS_LESS_BIND 6 N NUMBER(1,0) 0 是否允许短配 0 否 1 是 PLAN_OUT_QNTY 7 N NUMBER(18,3) 计划数量 BIND_OUT_QNTY 8 Y NUMBER(18,3) 配货数量 ACTL_OUT_QNTY 9 Y NUMBER(18,3) NULL 实际数量 POST_ST 10 N VARCHAR2(10) '0' 过账状态(0-未过账 1-已上传接口中间表 2-已上传SAP) POST_OUT_QNTY 11 Y NUMBER(18,3) 过账数量 BIND_OUT_COMM 12 Y VARCHAR2(200) 配货说明 BILL_OUT_DTL_ST 13 N VARCHAR2(10) '0' 出库单明细状态(0-初始 1-执行 3-出库中 4-出库完成 5-发运完成 9-已撤销) BILL_OUT_DTL_ST_HIS 14 Y VARCHAR2(100) '0' 出库单明细历史状态 CREATE_USER_ID 15 Y NUMBER(10,0) 生成用户 CREATE_DATE 16 Y DATE SYSDATE 生成日期 CREATE_MODULE_ID 17 Y NUMBER(10,0) 生成模块 UPDATE_USER_ID 18 Y NUMBER(10,0) 更新用户 UPDATE_DATE 19 Y DATE SYSDATE 更新日期 UPDATE_MODULE_ID 20 Y NUMBER(10,0) 更新模块 COMMENTS 21 Y VARCHAR2(200) 备注 INTERFACE_CREUSR 22 Y VARCHAR2(50) 创建人员编号(接口) INTERFACE_CHGUSR 23 Y VARCHAR2(50) 修改人员编号(接口) INTERFACE_CREDATE 24 Y DATE 数据生成日期(接口) INTERFACE_POST_DATE 25 Y DATE 过账日期(接口) LOT 26 Y VARCHAR2(100) 批号 WAVE_NO 27 Y VARCHAR2(20) 特殊库存标识 IS_VIR_OUT 28 N INTEGER 1 是否虚拟出库 0:虚拟 1:非虚拟 ORDERID 29 Y VARCHAR2(20) MES生产工单号 WERKS 30 Y VARCHAR2(16) 工厂编号 LGORT 31 Y VARCHAR2(4) 发货库存地点 VGBEL 32 Y VARCHAR2(20) 主单号(交货单号) VGPOS 33 Y VARCHAR2(10) 主单行项目号(交货单行项目号) KOSTL 34 Y VARCHAR2(10) SAP成本中心号 GRUND 35 Y VARCHAR2(4) SAP移动原因 LFBNR 36 Y VARCHAR2(10) 物料凭证号 LFPOS 37 Y VARCHAR2(10) 物料凭证行项目号 LFDAT 38 Y VARCHAR2(4) 物料凭证年份 REC_LFBNR 39 Y VARCHAR2(10) 反冲物料凭证号 REC_LFDAT 40 Y VARCHAR2(4) 反冲物料凭证年份 STEPID 41 Y VARCHAR2(20) MES工序 SLOT 42 Y VARCHAR2(20) MES槽位(WMS出库顺序) CONT_NO 43 Y VARCHAR2(100) 托盘条码(成品加严检使用) PCBSIDE 44 Y VARCHAR2(20) PCB面 STGE_LOC_TO 45 Y VARCHAR2(4) 目标库存地点 LGPBE 46 Y VARCHAR2(10) SAP仓位 BEZEI 47 Y VARCHAR2(50) 分公司 VTEXT 48 Y VARCHAR2(50) 分销渠道 NAME1 49 Y VARCHAR2(100) 送达方 STREET 50 Y VARCHAR2(500) 送达方地址 REMARK 51 Y VARCHAR2(50) 收件人 WULIU 52 Y VARCHAR2(500) 存运物流 BARCODE 53 Y VARCHAR2(30) 最小包装条码 SOUR_NO 54 Y VARCHAR2(20) 来源单号 (参照到生产工单生成出库单,记录生产工单号 参照领料申请单生成出库单,记录领料申请单号 质检借出,记录来源的报检单号 报废出库,记录来源的入库单号) SOUR_DT_ID 55 Y VARCHAR2(20) 来源单据行ID 按照上面已经写出创建试图的脚本,如下: CREATE OR REPLACE VIEW VW_BILL_OUT_MT_BY_DT AS SELECT MT.BILL_OUT_MT_ID, /*出库订单ID*/ MT.BILL_OUT_MT_NO, /*出库单编号*/ MT.BILL_OUT_TYPE, /*单据类型*/ CAST((CASE MT.BILL_OUT_TYPE WHEN 'BILL_OUT_STGE_WIP' THEN '原料调拨出库' WHEN 'BILL_OUT_OTOUT_WIP' THEN '原料其它出库' WHEN 'BILL_OUT_PORET_WIP' THEN '原料采购退货' WHEN 'BILL_OUT_LEND_WIP' THEN '原料借换单' WHEN 'BILL_OUT_PD_WIP' THEN '原料生产出库' WHEN 'BILL_OUT_SAL_FG' THEN '成品销售出库' WHEN 'BILL_OUT_PDRET_FG' THEN '成品生产退回' WHEN 'BILL_OUT_RZJS_FG' THEN '成品技术领料(认证)出库' WHEN 'BILL_OUT_OTOUT_FG' THEN '成品其它出库' WHEN 'BILL_OUT_PORET_FG' THEN '成品采购退货' ELSE MT.BILL_OUT_TYPE END) AS VARCHAR(50)) AS BILL_OUT_TYPE_NM, /*单据类型名称*/ MT.CUSTOMER_ID, /*客户ID*/ MT.FROM_ERP, /*是否ERP导入*/ CAST((CASE MT.FROM_ERP WHEN 0 THEN 'WMS自建' WHEN 1 THEN 'ERP导入' ELSE '未知' END) AS VARCHAR(20)) AS FROM_ERP_NM, /*ERP导入状态*/ MT.SHIP_LC, /*集货货位*/ MT.BILL_OUT_MT_ST, /*主表出库单状态*/ CAST((CASE MT.BILL_OUT_MT_ST WHEN '0' THEN '初始' WHEN '1' THEN '执行' WHEN '3' THEN '出库中' WHEN '4' THEN '出库完成' WHEN '5' THEN '发运完成' WHEN '9' THEN '已撤销' ELSE '未知' END) AS VARCHAR(20)) AS BILL_OUT_MT_ST_NM, /*主表状态名称*/ MT.STATE AS MT_STATE, /*主表审核状态*/ CAST((CASE MT.STATE WHEN '0' THEN '初始' WHEN '1' THEN '已审核' ELSE '未知' END) AS VARCHAR(20)) AS MT_STATE_NM, /*审核状态名称*/ MT.CREATE_USER_ID AS MT_CREATE_USER, /*主表生成用户*/ MT.CREATE_DATE AS MT_CREATE_DATE, /*主表生成日期*/ MT.REVIEWER_ID, /*主表审核人*/ MT.REVIEW_DATE, /*主表审核日期*/ MT.COMMENTS AS MT_COMMENTS, /*主表备注*/ DT.BILL_OUT_DT_ID, /*出库单明细ID*/ DT.ITEM_ID, /*物品ID*/ DT.PLAN_OUT_QNTY, /*计划数量*/ DT.BIND_OUT_QNTY, /*配货数量*/ DT.ACTL_OUT_QNTY, /*实际数量*/ DT.POST_ST, /*明细过账状态*/ CAST((CASE DT.POST_ST WHEN '0' THEN '未过账' WHEN '1' THEN '已上传接口中间表' WHEN '2' THEN '已上传SAP' ELSE '未知' END) AS VARCHAR(20)) AS POST_ST_NM, /*过账状态名称*/ DT.POST_OUT_QNTY, /*过账数量*/ DT.BILL_OUT_DTL_ST, /*明细状态*/ CAST((CASE DT.BILL_OUT_DTL_ST WHEN '0' THEN '初始' WHEN '1' THEN '执行' WHEN '3' THEN '出库中' WHEN '4' THEN '出库完成' WHEN '5' THEN '发运完成' WHEN '9' THEN '已撤销' ELSE '未知' END) AS VARCHAR(20)) AS BILL_OUT_DTL_ST_NM, /*明细状态名称*/ DT.IS_LESS_BIND, /*是否允许短配*/ CAST((CASE DT.IS_LESS_BIND WHEN 0 THEN '否' WHEN 1 THEN '是' ELSE '未知' END) AS VARCHAR(10)) AS IS_LESS_BIND_NM, /*短配状态*/ DT.IS_VIR_OUT, /*是否虚拟出库*/ CAST((CASE DT.IS_VIR_OUT WHEN 0 THEN '虚拟' WHEN 1 THEN '非虚拟' ELSE '未知' END) AS VARCHAR(10)) AS IS_VIR_OUT_NM, /*虚拟出库状态*/ DT.LOT, /*批号*/ DT.SOUR_NO, /*来源单号*/ DT.SOUR_DT_ID, /*来源单据行ID*/ DT.COMMENTS AS DT_COMMENTS /*明细备注*/ FROM BILL_OUT_MT MT JOIN BILL_OUT_DT DT ON MT.BILL_OUT_MT_ID = DT.BILL_OUT_MT_ID; COMMENT ON TABLE VW_BILL_OUT_MT_BY_DT IS '出库单视图(主表关联明细表)'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BILL_OUT_MT_ID IS '出库订单ID'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BILL_OUT_MT_NO IS '出库单编号'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BILL_OUT_TYPE IS '单据类型'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BILL_OUT_TYPE_NM IS '单据类型名称'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.CUSTOMER_ID IS '客户ID'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.FROM_ERP IS '是否ERP导入'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.FROM_ERP_NM IS 'ERP导入状态'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.SHIP_LC IS '集货货位'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BILL_OUT_MT_ST IS '主表出库单状态'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BILL_OUT_MT_ST_NM IS '主表状态名称'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.MT_STATE IS '主表审核状态'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.MT_STATE_NM IS '审核状态名称'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.MT_CREATE_USER IS '主表生成用户'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.MT_CREATE_DATE IS '主表生成日期'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.REVIEWER_ID IS '主表审核人'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.REVIEW_DATE IS '主表审核日期'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.MT_COMMENTS IS '主表备注'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BILL_OUT_DT_ID IS '出库单明细ID'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.ITEM_ID IS '物品ID'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.PLAN_OUT_QNTY IS '计划数量'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BIND_OUT_QNTY IS '配货数量'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.ACTL_OUT_QNTY IS '实际数量'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.POST_ST IS '明细过账状态'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.POST_ST_NM IS '过账状态名称'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.POST_OUT_QNTY IS '过账数量'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BILL_OUT_DTL_ST IS '明细状态'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.BILL_OUT_DTL_ST_NM IS '明细状态名称'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.IS_LESS_BIND IS '是否允许短配'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.IS_LESS_BIND_NM IS '短配状态'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.IS_VIR_OUT IS '是否虚拟出库'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.IS_VIR_OUT_NM IS '虚拟出库状态'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.LOT IS '批号'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.SOUR_NO IS '来源单号'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.SOUR_DT_ID IS '来源单据行ID'; COMMENT ON COLUMN VW_BILL_OUT_MT_BY_DT.DT_COMMENTS IS '明细备注'; 请基于以上脚本的基础上,使其修改符合下面业务需求,同以上脚本是已经创建过的,即数据库已经执行过以上的语句了 主界面 添加 1.界面打开为新增功能,选择供应商、仓库、税率、汇率、币种、采购部门、出入库类型,录入备注信息。 存货选择 存货选择参考借换单操作。 编辑 编辑操作参考借换单操作。 保存 1.根据界面数据,生成退货单主单和明细数据,单据状态为初始。 删行 删行操作参考借换单操作。 删除 删除操作参考借换单操作。 审核 1.选择退货单同选择借换单操作。 2.点击审核,将退库单审核状态更改为审核状态,作业人员PDA上可以查到退库下架任务。 (1)只允许审核状态为初始态的点击审核,其他状态的提示状态不正确。 审核处理 1.只允许审核状态为初始的退货单审核,其他状态不允许。 2.退货单审核状态更新为已审核。 3.退货单的出库状态更新为执行。 4.退货单明细的状态更新为执行。 弃审 1.选择退货单同选择借换单操作。 2.选中一行退货单,点击弃审,将退库单状态更改为初始状态。 (1)只允许审核状态为审核的点击弃审,其他状态的提示状态不正确。 (2)弃审如果有下架数量,不允弃审。 弃审处理 1.只有审核状态为审核的退货单允许弃审,其他状态的提示状态不正确。 2.退货单中有下架数量,提示不允许弃审。 3.退货单状态更新为初始。 4.退货单的出库状态更新为初始。 完成 1.选择退货单同选择借换单操作。 2.作业人员下架完成后,点击完成,将状态变更为完成状态。 (1)只有审核状态为审核,且出库状态为出库完成的退货单允许点击完成,其他状态的提示状态不正确。 (2)下架数量必须等于退货数量,才可以点击完成。 2.完成后回抛ERP红字采购入库单,记录回抛成功标识,回抛间,ERP返回的红字采购入库单号。 清空 1.点击清空,清除界面查询条件。 界面打开 界面打开显示空数据。
05-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值