本文介紹基於Microsoft SQL Server軟體,實現資料庫用戶自定義數據類型的創建、使用與刪除,以及標量值、內嵌表值、多語句表值函數等用戶定義函數的創建、使用、刪除方法~ ...
本文介紹基於Microsoft SQL Server軟體,實現資料庫用戶自定義數據類型的創建、使用與刪除,以及標量值、內嵌表值、多語句表值函數等用戶定義函數的創建、使用、刪除方法。
目錄- 1 用SQL語句創建一個用戶定義的數據類型Idnum
- 2 使用Idnum創建學生表STUDENT與教師表TEACHER
- 3 互動式創建一個用戶定義的數據類型Nameperson
- 4 使用數據類型Nameperson修改資料庫表數據類型
- 5 使用系統存儲過程刪除數據類型Nameperson
- 6 互動式刪除數據類型Idnum
- 7 互動式創建標量函數Score_FUN
- 8 使用標量函數Score_FUN查詢資料庫表中信息
- 9 用SQL創建內嵌表值函數S_Score_FUN
- 10 使用內嵌表值函數S_Score_FUN查詢資料庫表中信息
- 11 用SQL創建多語句函數ALL_Score_FUN
- 12 使用多語句函數ALL_Score_FUN查詢資料庫表中信息
- 13 互動式修改函數Score_FUN
- 14 使用函數Score_FUN查詢資料庫表中信息
- 15 用SQL修改函數S_Score_FUN
- 16 使用函數S_Score_FUN查詢資料庫表中信息
- 17 互動式刪除函數Score_FUN
- 18 用SQL刪除函數S_Score_FUN
系列文章中示例數據來源於《SQL Server實驗指導(2005版)》一書。依據本系列文章的思想與對操作步驟、代碼的詳細解釋,大家用自己手頭的數據,可以將相關操作與分析過程加以完整重現。
1 用SQL語句創建一個用戶定義的數據類型Idnum
(1) 啟動Microsoft SQL Server 2008 R2軟體;
(2) 在“對象資源管理器”窗格中,在“資料庫”處右鍵,在彈出的菜單中選擇“附加”選項;
(3) 選擇需要加以附加的jxsk資料庫物理文件,選擇定位文件夾“G:\sql\chutianjia sql”並選擇對應資料庫jxsk的物理文件並選擇“確定”按鈕,再次選擇“確定”即可;
(4) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
EXEC sp_addtype Idnum,'CHAR(6)','NOT NULL'
GO
(5) 單擊“工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(6) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“類型”→“用戶定義數據類型”,可在其中看到數據類型Idnum已經存在,如下圖;
2 使用Idnum創建學生表STUDENT與教師表TEACHER
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
CREATE TABLE STUDENT(
SNO IDNUM,
SN CHAR(11),
SSEX CHAR(2),
SAGE TINYINT)
GO
CREATE TABLE TEACHER(
TNO IDNUM,
TN CHAR(11),
TSEX CHAR(2),
TAGE TINYINT,
TPROF CHAR(11))
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(3) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“表”,選擇學生表STUDENT與教師表TEACHER,看到相應欄位及其定義Idnum,如下圖;
3 互動式創建一個用戶定義的數據類型Nameperson
(1) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“類型”,右擊“用戶定義數據類型”,在彈出的視窗中選擇“新建用戶定義數據類型”,如下圖;
(2) 正確配置相關選項,選擇正確的名稱、數據類型與長度,點擊“確定”;
(3) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“類型”→“用戶定義數據類型”,可看到數據類型Nameperson的定義;
4 使用數據類型Nameperson修改資料庫表數據類型
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
ALTER TABLE STUDENT ALTER COLUMN SN NAMEPERSON
GO
ALTER TABLE TEACHER ALTER COLUMN TN NAMEPERSON
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(3) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“表”,查看資料庫表學生表STUDENT與教師表TEACHER相關列的定義已隨之改變;
5 使用系統存儲過程刪除數據類型Nameperson
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
ALTER TABLE STUDENT ALTER COLUMN SN CHAR(10) NOT NULL
GO
ALTER TABLE TEACHER ALTER COLUMN TN CHAR(10) NOT NULL
GO
EXEC sp_droptype NAMEPERSON
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(3) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“類型”→“用戶定義數據類型”,可看到數據類型Nameperson已經不存在;
6 互動式刪除數據類型Idnum
(1) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“類型”→“用戶定義數據類型”,右擊後選擇“刪除”,選擇“確定”;
(2) 發現刪除出現問題,認為是由於資料庫表中有列仍然在使用這一數據結構,故需先將上述數據結構從表中移除再進行刪除操作,輸入的SQL語言為:
USE jxsk
GO
ALTER TABLE STUDENT ALTER COLUMN SNO CHAR(10) NOT NULL
GO
ALTER TABLE TEACHER ALTER COLUMN TNO CHAR(10) NOT NULL
GO
結果如下;
(3) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“類型”→“用戶定義數據類型”,發現數據類型Idnum已不再存在;
7 互動式創建標量函數Score_FUN
(1) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“函數”→“標量值函數”,右擊併在彈出的視窗中選擇“新建標量值函數”,打開的視窗包含模板語句如下:
-- ================================================
-- Template generated from Template Explorer using:
-- Create Scalar Function (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the function.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName>
(
-- Add the parameters for the function here
<@Param1, sysname, @p1> <Data_Type_For_Param1, , int>
)
RETURNS <Function_Data_Type, ,int>
AS
BEGIN
-- Declare the return variable here
DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>
-- Add the T-SQL statements to compute the return value here
SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1>
-- Return the result of the function
RETURN <@ResultVar, sysname, @Result>
END
GO
(2) 將上述語句改為:
CREATE FUNCTION SCORE_FUN(@SNAME_IN CHAR(8),
@CNAME_IN CHAR(10))
RETURNS TINYINT
AS
BEGIN
DECLARE @SCORE_OUT TINYINT
SELECT @SCORE_OUT=SCORE FROM SC,S,C
WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND SN=@SNAME_IN AND CN=@CNAME_IN
RETURN(@score_out)
END
(3) 單擊“分析”對語句加以語法檢查,如下圖;單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(4) 第一次輸入語句有誤,更正後如下;
(5) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“函數”→“標量值函數”,可看到已建立的標量函數Score_FUN;
8 使用標量函數Score_FUN查詢資料庫表中信息
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
DECLARE @S_SCORE TINYINT
EXEC @S_SCORE=DBO.SCORE_FUN '錢爾','編譯原理'
PRINT'錢爾的編譯原理成績是'+STR(@S_SCORE)
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(3) 第一次語句輸入有誤,沒有將漢語語句輸入進去,從而在最終結果出現錯誤;
(4) 隨後對語句加以更正,結果恢復正常;
9 用SQL創建內嵌表值函數S_Score_FUN
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
CREATE FUNCTION S_SCORE_FUN(@SNAME_IN CHAR(8))
RETURNS TABLE
AS
RETURN (SELECT CN,SCORE FROM S,SC,C
WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND SN=@SNAME_IN)
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(3) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“函數”→“表值函數”,可看到已建立的內嵌表值函數S_Score_FUN;
10 使用內嵌表值函數S_Score_FUN查詢資料庫表中信息
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
SELECT*FROM S_SCORE_FUN('錢爾')
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
11 用SQL創建多語句函數ALL_Score_FUN
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
CREATE FUNCTION ALL_SCORE_FUN(@CNAME_IN CHAR(10))
RETURNS @ALL_SCORE_TAB TABLE(SNO CHAR(2) PRIMARY KEY,
SN CHAR(8) NOT NULL,SEX CHAR(2),SCORE TINYINT)
AS
BEGIN
INSERT @ALL_SCORE_TAB
SELECT S.SNO,SN,SEX,SCORE
FROM S,SC,C
WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND CN=@CNAME_IN
RETURN
END
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(3) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“函數”→“表值函數”,可看到已建立的多語句函數ALL_Score_FUN;
12 使用多語句函數ALL_Score_FUN查詢資料庫表中信息
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
SELECT*FROM ALL_SCORE_FUN('微機原理')
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(3) 能看到我的結果是空白。檢查語句發現並沒有錯誤,則返回原有資料庫表對數據加以檢查,發現我的資料庫表中確實沒有微機原理的相關數據,所以考慮更換語句為
USE jxsk
GO
SELECT*FROM ALL_SCORE_FUN('資料庫')
GO
(4) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
13 互動式修改函數Score_FUN
(1) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“函數”→“標量值函數”,右擊併在彈出的視窗中選擇“新建標量值函數”,打開的視窗包含模板語句如下:
USE [jxsk]
GO
/****** Object: UserDefinedFunction [dbo].[SCORE_FUN] Script Date: 05/21/2019 19:34:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[SCORE_FUN](@SNAME_IN CHAR(8),
@CNAME_IN CHAR(10))
RETURNS TINYINT
AS
BEGIN
DECLARE @SCORE_OUT TINYINT
SELECT @SCORE_OUT=SCORE FROM SC,S,C
WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND SN=@SNAME_IN AND CN=@CNAME_IN
RETURN(@score_out)
END
(2) 將上述語句改為
ALTER FUNCTION SCORE_FUN(@SNAME_IN CHAR(10),@CNAME_IN CHAR(10))
RETURNS CHAR(8)
AS
BEGIN
DECLARE @SCORE_OUT CHAR(8)
SELECT @SCORE_OUT=
CASE
WHEN SCORE IS NULL THEN '未考'
WHEN SCORE<60 THEN '不及格'
WHEN SCORE>=60 AND SCORE<70 THEN '及格'
WHEN SCORE>=70 AND SCORE<80 THEN '中'
WHEN SCORE>=80 AND SCORE<90 THEN '良好'
WHEN SCORE>=90 THEN '優秀'
END
FROM SC,S,C
WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND SN=@SNAME_IN AND CN=@CNAME_IN
RETURN(@SCORE_OUT)
END
(3) 單擊“分析”對語句加以語法檢查,如下圖; 檢查後發現語句輸入有誤,對其加以回顧找出所存在錯誤並加以修改,再次進行語法檢查如下下圖; 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下下下圖;
(4) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“函數”→“標量值函數”→“dbo.Score_FUN”→“參數”節點,查看其參數變化;
14 使用函數Score_FUN查詢資料庫表中信息
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
DECLARE @S_SCORE CHAR(8)
EXEC @S_SCORE=DBO.SCORE_FUN '錢爾','編譯原理'
PRINT'錢爾的編譯原理成績是'+@S_SCORE
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
15 用SQL修改函數S_Score_FUN
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE JXSK
GO
ALTER FUNCTION S_SCORE_FUN(@SNAME_IN CHAR(8))
RETURNS TABLE
AS
RETURN (SELECT CN,SCORE,
LEVER=
CASE
WHEN SCORE IS NULL THEN '未考'
WHEN SCORE<60 THEN '不及格'
WHEN SCORE>=60 AND SCORE<70 THEN '及格'
WHEN SCORE>=70 AND SCORE<80 THEN '中'
WHEN SCORE>=80 AND SCORE<90 THEN '良好'
WHEN SCORE>=90 THEN '優秀'
END
FROM S,SC,C
WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND SN=@SNAME_IN)
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
16 使用函數S_Score_FUN查詢資料庫表中信息
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
GO
SELECT*FROM S_SCORE_FUN('錢爾')
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
17 互動式刪除函數Score_FUN
(1) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“函數”→“標量值函數”→“dbo.Score_FUN”並右擊,在彈出的視窗中選擇“刪除”選項;
(2) 在彈出的“刪除對象”視窗中選擇“確定”選項,函數Score_FUN即被刪除;
18 用SQL刪除函數S_Score_FUN
(1) 單擊屏幕上方 “工具欄”菜單中的“新建查詢”按鈕,打開“查詢編輯器”視窗,併在“查詢編輯器”視窗中輸入以下T-SQL語句:
USE jxsk
DROP FUNCTION S_SCORE_FUN
GO
(2) 單擊 “工具欄”中的“執行(x)”按鈕,即可執行上述T-SQL語句,如下圖;
(3) 在“對象資源管理器”中選擇“資料庫”→“jxsk”→“可編程性”→“函數”→“表值函數”節點可看到函數S_Score_FUN已被刪除;
至此,大功告成。