SQL Server 存储过程、函数与游标核心语法详解

Nora
Nora
发布时间:2026-10-14| 4人浏览过
原创

深入解析 SQL Server 的核心编程能力,涵盖存储过程、自定义函数、游标及触发器的标准写法。重点演示如何处理参数传递、多条件查询优化及复杂数据逻辑处理。

存储过程的创建与调用

存储过程是预编译的 SQL 语句集合,能够提高执行效率并增强安全性。以下是处理输入参数和输出参数的基本模式:

  1. 带输入参数的过程:通过 @paramname type 定义参数,在 AS 块中使用。
  2. 带输出参数的过程:声明时需在类型后添加 OUTPUT 关键字。
-- 有输入参数的存储过程
CREATE PROCEDURE GetComment
    @commentid int
AS
SELECT * FROM Comment WHERE CommentID = @commentid

-- 有输入与输出参数的存储过程
CREATE PROCEDURE GetCommentCount
    @newsid int,
    @count int OUTPUT
AS
SELECT @count = COUNT(*) FROM Comment WHERE NewsID = @newsid

调用带有 Output 返回值的存储过程时,需要在变量声明中标记 OUTPUT:

DECLARE @resultCount int;
EXEC GetCommentCount @newsid = 2, @count = @resultCount OUTPUT;
PRINT @resultCount;

多条件查询优化策略

在开发过程中,需要根据多个可选参数构建查询。拼接 SQL 字符串虽然灵活但易受注入攻击且难以维护,下面介绍几种更安全的实现方式:

第1步:IF/ELSE 分支控制

根据不同的参数组合编写特定的查询语句,结构清晰但较为冗余:

-- 根据参数有效性选择对应的查询逻辑
IF (@addDate IS NOT NULL) AND (@name <> '')
    SELECT * FROM [table] WHERE addDate = @addDate AND name = @name
ELSE IF (@addDate IS NOT NULL) AND (@name = '')
    SELECT * FROM [table] WHERE addDate = @addDate
ELSE IF (@addDate IS NULL) AND (@name <> '')
    SELECT * FROM [table] WHERE name = @name
ELSE
    SELECT * FROM [table]

第2步:使用 OR 逻辑简化条件

利用参数为默认值(Null 或空串)时恒成立的特性简化代码:

SELECT * FROM [table] 
WHERE (addDate = @addDate OR @addDate IS NULL) 
AND (name = @name OR @name = '')

自定义函数的分类与应用

SQL Server 支持多种类型的函数,主要包括标量值函数和表值函数(内联或多语句)。

第1步:创建标量值函数

此类函数返回单个数据值:

CREATE FUNCTION MyFunction(@newsid int)
RETURNS int
AS
BEGIN
    DECLARE @count int;
    SELECT @count = COUNT(*) FROM Comment WHERE NewsID = @newsid;
    RETURN @count;
END

-- 调用标量函数需要使用 schema.dbo 前缀
SELECT dbo.MyFunction(2);

第2步:创建表值函数

内联表值函数类似于带参数的视图:

CREATE FUNCTION GetFunctionTable(@newsid int)
RETURNS TABLE
AS
RETURN (SELECT * FROM Comment WHERE NewsID = @newsid)

-- 调用表值函数可直接作为表操作
SELECT * FROM GetFunctionTable(2);

T-SQL 核心对象与语法组件

除存储过程和函数外,以下元素也是进行复杂数据处理的基础工具:

局部变量与赋值

使用 DECLARE 定义,可用 SET 或直接赋值:

DECLARE @a INT;
SET @a = 5; -- 推荐用于标量赋值

DECLARE @user NVARCHAR(50);
SELECT @user = Name FROM ST_User WHERE ID = 1; -- 从结果集赋值

临时表与表变量

本地临时表以 # 开头,在当前会话结束后自动销毁,适用于大批量数据处理:

CREATE TABLE #tempUser (
    ID INT,
    Name NVARCHAR(50)
);
INSERT INTO #tempUser SELECT ID, Name FROM ST_User;
DROP TABLE #tempUser;

游标 (Cursor) 的使用

当需要逐行处理结果集时,可使用游标。注意游标会消耗较多资源:

DECLARE cur_cursor CURSOR FOR 
SELECT ID, Name FROM ST_User;
OPEN cur_cursor;
FETCH NEXT FROM cur_cursor INTO @ID, @Name;
WHILE @@FETCH_STATUS = 0
BEGIN
    -- 处理逻辑...
    FETCH NEXT FROM cur_cursor INTO @ID, @Name;
END
CLOSE cur_cursor;
DEALLOCATE cur_cursor;

触发器基础

触发器包含两个特殊的虚拟表:Inserted 和 Deleted。对于 UPDATE 操作,旧数据存在于 Deleted,新数据存在于 Inserted:

CREATE TRIGGER trg_User_Update ON ST_User
FOR UPDATE
AS
BEGIN
    INSERT INTO LOG ([MSG])
    SELECT '更新日志:用户 ' + CAST(Deleted.ID AS VARCHAR) + ' 信息已变更' 
    FROM Inserted, Deleted;
END;

以上就是SQL Server存储过程与自定义函数编写的详细内容,更多关于T-SQL高级语法的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。