-- 删除学生信息的存储过程
CREATE PROCEDURE DeleteStudent@StudentID INT
AS
BEGINIF EXISTS(SELECT 1 FROM Students WHERE StudentID = @StudentID)BEGINDELETE FROM Students WHERE StudentID = @StudentID;PRINT '学生已删除。';ENDELSEBEGINPRINT '学生不存在,无法删除。';END
END;使用:
EXEC DeleteStudent @StudentID =1;
-- 获取所有表名和对应的索引名
SELECT t.name AS TableName,i.name AS IndexName
FROM sys.tables t
INNER JOIN sys.indexes i ON t.object_id = i.object_id
WHERE i.type >0-- 排除堆表
ORDER BY t.name, i.name;
-- 获取所有存储过程名称
SELECT name AS SPName
FROM sys.procedures
WHERE type ='P'-- 存储过程
ORDER BY name;
CREATE PROCEDURE RefreshIndexesAndSPs
AS
BEGINSET NOCOUNT ON;DECLARE @TableName NVARCHAR(128)DECLARE @IndexName NVARCHAR(128)DECLARE @SQL NVARCHAR(MAX)-- 获取所有表和索引DECLARE cur CURSOR FORSELECT t.name AS TableName,i.name AS IndexNameFROM sys.tables tINNER JOIN sys.indexes i ON t.object_id = i.object_idWHERE i.type >0-- 排除堆表OPEN curFETCH NEXT FROM cur INTO @TableName, @IndexNameWHILE @@FETCH_STATUS =0BEGIN-- 执行 REBUILD 索引SET @SQL = N'ALTER INDEX ['+ @IndexName +'] ON ['+ @TableName +'] REBUILD;'EXEC sp_executesql @SQL-- 可选:根据碎片率判断是否使用 REORGANIZE-- 这里为了简化,直接使用 REBUILDFETCH NEXT FROM cur INTO @TableName, @IndexNameENDCLOSE curDEALLOCATE cur-- 重新编译所有存储过程DECLARE @SPName NVARCHAR(128)DECLARE cur_sp CURSOR FORSELECT name FROM sys.procedures WHERE type ='P'OPEN cur_spFETCH NEXT FROM cur_sp INTO @SPNameWHILE @@FETCH_STATUS =0BEGINSET @SQL = N'EXEC sp_recompile '''+ @SPName +''''EXEC sp_executesql @SQLFETCH NEXT FROM cur_sp INTO @SPNameENDCLOSE cur_spDEALLOCATE cur_spPRINT '索引刷新和存储过程重新编译完成。'
END使用:
EXEC RefreshIndexesAndSPs;