应用题 2.  设在SQL Server 2008某数据库中有商品表和销售表,表的定义如下:
    CREATE TABLE 商品表(
    商品号 char(10) PRIMARY KEY,
    商品名 char(20) NOT NULL,
    单价 int DEFAULT 0)
    CREATE TABLE 销售表(
    商品号 char(10),
    销售时间 datetime,
    销售数量 int NOT NULL,
    PRIMARY KEY(商品号,销售时间),
    FOREIGN KEY(商品号) REFERENCES 商品表(商品号))
    现要创建一个具有如下功能的用户自定义标量函数:根据指定的商品号,返回该商品的销售总金额。请补全下列代码(请不要为表起别名)。
    CREATE FUNCTION dbo.f_TotalQty(@GoodID ______)
    ______ int
    AS
    ______
    RETURN(SELECT ______ (单价 * 销售数量) FROM 商品表
    JOIN ______
    ON ______
    WHERE 商品号 =______)
    ______
【正确答案】Char
   RETURNS
   BEGIN
   SUM
   销售表
   商品表.商品号 = 销售表.商品号或销售表.商品号 = 商品表.商品号
   @GoodID
   END
【答案解析】 此题考查的是标量函数的使用。标量函数的语法格式:
   CREATE FUNCTION [函数名](@参数名 参数类型)
   RETURNS [返回值类型]
   AS
   BEGIN
   [sql语句]
   End
   对比语法格式可以发现,第一个空处应该填写参数类型,由表的定义可以看出,商品号(GoodID)是字符型,因此此处应该填写:char,第二个空处应该填写:returns,第三个空处应该填写:BEGIN, 第八个空处应该填写:END。
   题目要求“根据指定的商品号,返回该商品的销售总金额”。商品金额=单价 * 销售数量。求指定商品的销售总金额,必然会用到SUM函数,因此可以推断出第四个空处应填写:SUM。
   单价是在商品表中,而销售数量在销售表中,因此必须采用两个表进行联接查询,在查询中要保证两个表中的商品号相同。两表进行联接运算包括内联接、左联接、右联接,后二者统称为外联接。内联接(INNER JOIN)主表和从表都存在的记录才会查出来,外联接(OUTER JOIN)如果主表中存在的记录,从表中不存在则用NULL替代,由此可见内联接符合题意。
   内联接语句sql语句如下:
   SELECT * FROM a
   (INNER,可省略)JOIN b
   ON a.aID =b.bID
   等同于以下SQL句:
   SELECT *
   FROM a,b
   WHERE a.aID = b.bID
   从语法可以推测出第五个空处应填写:销售表,第六个空处应填写:商品表.商品号 = 销售表.商品号或销售表.商品号 = 商品表.商品号。
   由于题目是指定输入商品号,因此第七个空处的商品号应该是一个参数,即@GoodID。