sqlserver 自定义函数
时间: 2025-07-15 14:59:40 浏览: 11
### 创建和使用 SQL Server 自定义函数
在 SQL Server 中,用户可以通过自定义函数(User-Defined Functions,简称 UDF)来封装业务逻辑、执行计算或返回复杂的数据集。SQL Server 支持两种主要类型的自定义函数:**标量值函数** 和 **表值函数**。
#### 标量值函数
标量值函数用于返回一个单一值,通常用于数据转换、逻辑判断等场景。创建标量值函数时需要指定输入参数、返回值类型以及函数体逻辑。
以下是一个创建标量值函数的示例,该函数用于返回某个产品的折扣后价格:
```sql
CREATE FUNCTION dbo.CalculateDiscountedPrice (
@OriginalPrice DECIMAL(10, 2),
@DiscountRate DECIMAL(5, 2)
)
RETURNS DECIMAL(10, 2)
AS
BEGIN
DECLARE @DiscountedPrice DECIMAL(10, 2);
SET @DiscountedPrice = @OriginalPrice * (1 - @DiscountRate / 100);
RETURN @DiscountedPrice;
END
```
调用该函数的方式如下:
```sql
SELECT dbo.CalculateDiscountedPrice(100.00, 10) AS DiscountedPrice;
```
此函数可以嵌入到查询中,用于动态计算字段值[^2]。
#### 表值函数
表值函数用于返回一个表,适用于封装复杂的查询逻辑并以函数形式复用。其结构类似于视图,但支持传参,灵活性更高。
以下是一个内联表值函数的示例,该函数返回特定类别下的产品列表:
```sql
CREATE FUNCTION dbo.GetProductsByCategory (
@CategoryID INT
)
RETURNS TABLE
AS
RETURN (
SELECT ProductID, ProductName, UnitPrice
FROM Products
WHERE CategoryID = @CategoryID
);
```
调用该函数的方式如下:
```sql
SELECT * FROM dbo.GetProductsByCategory(1);
```
该函数可用于 JOIN 操作或其他子查询中,提升代码复用性和可维护性[^1]。
#### 修改与删除函数
若需修改已存在的函数,可以使用 `ALTER FUNCTION` 语句进行更新。例如:
```sql
ALTER FUNCTION dbo.CalculateDiscountedPrice (
@OriginalPrice DECIMAL(10, 2),
@DiscountRate DECIMAL(5, 2)
)
RETURNS DECIMAL(10, 2)
AS
BEGIN
DECLARE @DiscountedPrice DECIMAL(10, 2);
SET @DiscountedPrice = @OriginalPrice * (1 - @DiscountRate / 100) * 0.95; -- 新增额外折扣
RETURN @DiscountedPrice;
END
```
若不再需要某个函数,可以直接使用 `DROP FUNCTION` 删除:
```sql
DROP FUNCTION dbo.CalculateDiscountedPrice;
```
#### 函数的使用注意事项
- 函数应避免包含副作用操作(如修改数据库状态),否则可能导致不可预期的结果。
- 在性能敏感的场景下,应谨慎使用多语句表值函数,因其可能影响查询效率。
- 函数的命名应具有描述性,便于后续维护和理解。
###
阅读全文
相关推荐














