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 訂單總額