SqlCollections - 用戶定義數據類型和函數

  1 --==============================用戶定義數據類型和函數===============================
  2 --用戶定義數據類型
  3 EXEC sp_addtype 說明,'nvarchar(500)','null'
  4 
  5 --刪除用戶定義數據類型
  6 DROP TYPE 說明
  7 --OR:
  8 EXEC sp_droptype 說明
  9 
 10 --標量值函數
 11 --目標:返回某年份的訂單總金額
 12 CREATE FUNCTION 訂單總額(@year int)
 13 RETURNS money    --RETURNS + 返回值類型
 14 BEGIN
 15     DECLARE @total money
 16     SELECT @total = SUM(b.單價*b.數量*(1-b.折扣))
 17     FROM 訂單 a 
 18     JOIN 訂單明細 b
 19     ON a.訂單ID = b.訂單ID
 20     WHERE YEAR(訂購日期) = @year
 21     GROUP BY YEAR(訂購日期)
 22 
 23     RETURN @total;
 24 END
 25 GO
 26 --注意Schema不能丟
 27 PRINT '1998年的訂單總額爲:'+CONVERT(nvarchar(10),dbo.訂單總額(1998))
 28 
 29 --內聯表值函數
 30 --目標:顯示某時間段內的訂單
 31 CREATE FUNCTION 時間段訂單(@beginDate datetime,@endDate datetime)
 32 RETURNS TABLE
 33 RETURN SELECT * FROM 訂單 WHERE 訂購日期 BETWEEN @beginDate AND @endDate
 34 GO
 35 SELECT * FROM 時間段訂單('1996-7-1','1999-05-30')
 36 
 37 --多語句表值函數
 38 --目標:顯示所有的人員,包括供應商、客戶、運貨商、僱員
 39 CREATE FUNCTION 所有人員()    --就算沒有參數,括號也不能少
 40 RETURNS @名單 TABLE
 41     (
 42         編號 int IDENTITY(1,1) NOT NULL Primary key,
 43         姓名 nvarchar(30) NOT NULL,
 44         地址 nvarchar(500) NULL,
 45         郵編 varchar(20) NULL,
 46         電話 varchar(20) NULL,
 47         類別 nvarchar(10) NOT NULL
 48     )
 49 BEGIN
 50     INSERT INTO @名單
 51     SELECT 聯繫人姓名,地址,郵政編碼,電話,'供應商' FROM 供應商
 52 
 53     INSERT INTO @名單
 54     SELECT 聯繫人姓名,地址,郵政編碼,電話,'客戶' FROM 客戶
 55 
 56     INSERT INTO @名單
 57     SELECT 公司名稱,NULL,NULL,電話,'運貨商' FROM 運貨商
 58 
 59     INSERT INTO @名單
 60     SELECT 姓氏+名字,地址,郵政編碼,家庭電話+'-'+分機,'僱員' FROM 僱員
 61 
 62     RETURN
 63 END
 64 GO
 65 SELECT * FROM 所有人員()
 66 
 67 
 68 select 僱員ID from 訂單
 69 WHERE YEAR(訂購日期) = 1998
 70 group by 僱員ID
 71 ORDER BY COUNT(訂單ID) DESC
 72 
 73 select * from 訂單 
 74 WHERE YEAR(訂購日期) = 1998
 75 and 僱員ID = 5
 76 
 77 --用戶定義函數也能夠用來設置默認值、約束、計算列等
 78 --目標:新建一個表,將編號字段的默認值設爲TCP-1,TCP-2,TCP-3...
 79 --建立函數
 80 CREATE FUNCTION 自增加編號()
 81 RETURNS varchar(10)
 82 BEGIN
 83     DECLARE @編號 varchar(10)
 84     DECLARE @id int
 85     SELECT TOP 1 @編號 = 編號 FROM 自增加編號測試表 ORDER BY 編號 DESC
 86     IF(@@ROWCOUNT = 0)
 87         SET @編號 = 'TCP-1'
 88     ELSE
 89         BEGIN
 90             --獲取編號的數字部分並+1
 91             SET @id = SUBSTRING(@編號,5,LEN(@編號)-4) + 1
 92             SET @編號 = 'TCP-' + CONVERT(varchar(10),@id)
 93         END
 94     RETURN @編號
 95 END
 96 GO
 97 --建立表
 98 CREATE TABLE 自增加編號測試表
 99 (
100     編號 varchar(10) DEFAULT dbo.自增加編號() NOT NULL,
101     名稱 varchar(10) NULL
102 )
103 GO
104 --插入數據
105 INSERT INTO 自增加編號測試表(名稱) VALUES('aaa')
106 INSERT INTO 自增加編號測試表(名稱) VALUES('bbb')
107 INSERT INTO 自增加編號測試表(名稱) VALUES('ccc')
108 SELECT * FROM 自增加編號測試表
109 
110 --刪除用戶定義函數
111 DROP FUNCTION 訂單總額
相關文章
相關標籤/搜索