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

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

深入解析 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 相关产品和应用

全部下载

专题列表