做網(wǎng)站騙子成都seo論壇
大家好,我是全棧小5,歡迎來到《小5講堂》。
這是《Sql Server》系列文章,每篇文章將以博主理解的角度展開講解。
溫馨提示:博主能力有限,理解水平有限,若有不對之處望指正!
目錄
- 前言
- 隨機(jī)查詢語句
- 自定義函數(shù)
- 基本概念
- 函數(shù)格式
- 函數(shù)例子
- 函數(shù)封裝
- 文章推薦
前言
溫故而知新,最近在寫sql查詢語句,需求是隨機(jī)查詢表的其中一條記錄。
基于這個查詢,順便把數(shù)據(jù)庫自定義函數(shù)、存儲過程這個兩個知識點(diǎn)重溫固定下。
因此,本篇文章將在隨機(jī)查詢一條表記錄的基礎(chǔ)上,把sql語句封裝到函數(shù)和存儲過程里。
隨機(jī)查詢語句
要在SQL Server中隨機(jī)生成一條記錄,可以使用ORDER BY NEWID()來隨機(jī)排序結(jié)果集,并使用TOP 1來限制結(jié)果集返回一條記錄。
例如:
select top 1 *
from(
select '張三11' as name union all select '張三22' as name union all
select '張三33' as name union all select '張三44' as name union all
select '張三55' as name union all select '張三66' as name union all
select '張三77' as name union all select '張三88' as name
) a
order by newid()select '張三11' as name union all select '張三22' as name union all
select '張三33' as name union all select '張三44' as name union all
select '張三55' as name union all select '張三66' as name union all
select '張三77' as name union all select '張三88' as name
自定義函數(shù)
基本概念
SQL Server中的函數(shù)可以分為兩類:系統(tǒng)函數(shù)和用戶自定義函數(shù)。
1.系統(tǒng)函數(shù)
這些函數(shù)是由SQL Server提供的內(nèi)置函數(shù),用于執(zhí)行各種操作,如字符串處理、數(shù)學(xué)運(yùn)算、日期時間處理等。
例如,LEN()用于返回字符串的長度,GETDATE()用于返回當(dāng)前日期和時間等。
2.用戶自定義函數(shù)
這些函數(shù)是用戶根據(jù)自己的需求自定義的函數(shù),可以根據(jù)業(yè)務(wù)邏輯執(zhí)行特定的操作。
用戶自定義函數(shù)分為以下幾種類型:
- 標(biāo)量函數(shù)(Scalar Function):接受零個或多個參數(shù),并返回單個值。
- 表值函數(shù)(Table-Valued Function):接受零個或多個參數(shù),并返回一個表作為結(jié)果集。
- 內(nèi)聯(lián)表值函數(shù)(Inline Table-Valued Function):類似于表值函數(shù),但是可以直接在查詢中調(diào)用,并且返回的表可以與其他表進(jìn)行聯(lián)接。
- 多語句表值函數(shù)(Multi-Statement Table-Valued Function):與內(nèi)聯(lián)表值函數(shù)不同,它可以包含多條SQL語句,并且使用RETURN語句返回結(jié)果集。
用戶自定義函數(shù)可以幫助簡化復(fù)雜的查詢和數(shù)據(jù)處理操作,并提高代碼的可維護(hù)性和可重用性。
函數(shù)格式
在 SQL Server 中,函數(shù)的基本格式如下:
CREATE FUNCTION [schema_name.]function_name
(@parameter1 datatype,@parameter2 datatype
)
RETURNS return_datatype
AS
BEGIN-- 函數(shù)邏輯RETURN return_value;
END;
- schema_name:函數(shù)所屬的模式(可選)。
- function_name:函數(shù)的名稱。
- @parameter1, @parameter2:函數(shù)的參數(shù)列表,包括參數(shù)名和數(shù)據(jù)類型。
- return_datatype:函數(shù)的返回值數(shù)據(jù)類型。
- RETURN return_value:函數(shù)體內(nèi)的邏輯操作,可以包括各種 SQL 語句和控制流程,最終通過 RETURN 語句返回結(jié)果。
函數(shù)例子
當(dāng)在 SQL Server 中創(chuàng)建自定義函數(shù)時,可以選擇創(chuàng)建標(biāo)量函數(shù)、表值函數(shù)或者內(nèi)聯(lián)表值函數(shù)。
以下是創(chuàng)建這些類型函數(shù)的基本方法示例:
1. 創(chuàng)建標(biāo)量函數(shù)(Scalar Function)
標(biāo)量函數(shù)接受零個或多個參數(shù),并返回單個值。
-- 創(chuàng)建標(biāo)量函數(shù)CREATE FUNCTION dbo.CalculateAge
(@BirthDate DATE
)
RETURNS INT
AS
BEGINDECLARE @Age INT;SET @Age = DATEDIFF(YEAR, @BirthDate, GETDATE());RETURN @Age;
END;
GO-- 調(diào)用標(biāo)量函數(shù)SELECT dbo.CalculateAge('1990-01-01') AS Age;
2. 創(chuàng)建表值函數(shù)(Table-Valued Function)
表值函數(shù)可以返回一個表作為結(jié)果集。
內(nèi)聯(lián)表值函數(shù)(Inline Table-Valued Function)
內(nèi)聯(lián)表值函數(shù)可以直接在查詢中使用。
-- 創(chuàng)建內(nèi)聯(lián)表值函數(shù)CREATE FUNCTION dbo.GetEmployeesByDepartment
(@DepartmentID INT
)
RETURNS TABLE
AS
RETURN
(SELECT EmployeeID, EmployeeNameFROM EmployeesWHERE DepartmentID = @DepartmentID
);
GO-- 調(diào)用內(nèi)聯(lián)表值函數(shù)SELECT * FROM dbo.GetEmployeesByDepartment(1);
多語句表值函數(shù)(Multi-Statement Table-Valued Function)
多語句表值函數(shù)包含多條 SQL 語句,并使用 RETURN 語句返回結(jié)果集。
-- 創(chuàng)建多語句表值函數(shù)CREATE FUNCTION dbo.GetEmployeesBySalaryRange
(@MinSalary DECIMAL(10, 2),@MaxSalary DECIMAL(10, 2)
)
RETURNS @Employees TABLE
(EmployeeID INT,EmployeeName NVARCHAR(100),Salary DECIMAL(10, 2)
)
AS
BEGININSERT INTO @Employees (EmployeeID, EmployeeName, Salary)SELECT EmployeeID, EmployeeName, SalaryFROM EmployeesWHERE Salary BETWEEN @MinSalary AND @MaxSalary;RETURN;
END;
GO-- 調(diào)用多語句表值函數(shù)SELECT * FROM dbo.GetEmployeesBySalaryRange(30000, 50000);
函數(shù)封裝
在封裝的時候,函數(shù)內(nèi)部也是會有一些限制,比如下面:
在函數(shù)內(nèi)對帶副作用的運(yùn)算符 ‘newid’ 的使用無效。
在函數(shù)內(nèi)對帶副作用的運(yùn)算符 ‘PRINT’ 的使用無效。
create function getName
(@id int,
@newid varchar(50))
returns nvarchar(50)
as
begindeclare @my_name nvarchar(50)select top 1 @my_name=nameValuefrom(select 1 as id,'張三11' as nameValue union all select 2 as id,'張三22' as name union all select 3 as id,'張三33' as nameValue union all select 4 as id,'張三44' as name union allselect 5 as id,'張三55' as nameValue union all select 6 as id,'張三66' as name union allselect 7 as id,'張三77' as nameValue union all select 8 as id,'張三88' as name) awhere id=1--order by CHECKSUM(@newid)--print(@my_name)return @my_name
endselect dbo.getName(8,newid())
文章推薦
【Sql Server】隨機(jī)查詢一條表記錄,并通過函數(shù)方式進(jìn)行封裝使用
【Sql Server】鎖表如何解鎖,模擬會話事務(wù)方式鎖定一個表然后進(jìn)行解鎖
【Sql Server】通過Sql語句批量處理數(shù)據(jù),使用變量且遍歷數(shù)據(jù)進(jìn)行邏輯處理
【新星計(jì)劃回顧】第六篇學(xué)習(xí)計(jì)劃-通過自定義函數(shù)和存儲過程模擬MD5數(shù)據(jù)
【新星計(jì)劃回顧】第四篇學(xué)習(xí)計(jì)劃-自定義函數(shù)、存儲過程、隨機(jī)值知識點(diǎn)
【Sql Server】Update中的From語句,以及常見更新操作方式
【Sql server】假設(shè)有三個字段a,b,c 以a和b分組,如何查詢a和b唯一,但是c不同的記錄
【Sql Server】新手一分鐘看懂在已有表基礎(chǔ)上修改字段默認(rèn)值和數(shù)據(jù)類型
總結(jié):溫故而知新,不同階段重溫知識點(diǎn),會有不一樣的認(rèn)識和理解,博主將鞏固一遍知識點(diǎn),并以實(shí)踐方式和大家分享,若能有所幫助和收獲,這將是博主最大的創(chuàng)作動力和榮幸。也期待認(rèn)識更多優(yōu)秀新老博主。