SQL Server 存储过程、函数与游标核心语法详解
深入解析 SQL Server 的核心编程能力,涵盖存储过程、自定义函数、游标及触发器的标准写法。重点演示如何处理参数传递、多条件查询优化及复杂数据逻辑处理。
存储过程的创建与调用
存储过程是预编译的 SQL 语句集合,能够提高执行效率并增强安全性。以下是处理输入参数和输出参数的基本模式:
- 带输入参数的过程:通过
@paramname type定义参数,在AS块中使用。 - 带输出参数的过程:声明时需在类型后添加
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高级语法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













