【发布时间】:2009-07-24 13:27:14
【问题描述】:
我想确保所有存储过程在语法上仍然有效。 (如果有人重命名/删除表/列,就会发生这种情况)。
现在我检查所有存储过程语法的解决方案是进入企业管理器,选择列表中的第一个存储过程,然后使用该过程:
- 输入
- Alt+C
- 逃跑
- 逃跑
- 向下箭头
- 转到 1
它有效,但它非常乏味。我想要一个名为
的存储过程SyntaxCheckAllStoredProcedures
就像我编写的其他存储过程一样,它对视图执行相同的操作:
刷新所有视图
为了大家的利益,RefreshAllViews:
RefreshAllViews.prc
CREATE PROCEDURE dbo.RefreshAllViews AS
-- This sp will refresh all views in the catalog.
-- It enumerates all views, and runs sp_refreshview for each of them
DECLARE abc CURSOR FOR
SELECT TABLE_NAME AS ViewName
FROM INFORMATION_SCHEMA.VIEWS
OPEN abc
DECLARE @ViewName varchar(128)
-- Build select string
DECLARE @SQLString nvarchar(2048)
FETCH NEXT FROM abc
INTO @ViewName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLString = 'EXECUTE sp_RefreshView '+@ViewName
PRINT @SQLString
EXECUTE sp_ExecuteSQL @SQLString
FETCH NEXT FROM abc
INTO @ViewName
END
CLOSE abc
DEALLOCATE abc
为了每个人的利益,存储过程将所有存储过程标记为需要重新编译(将存储过程标记为重新编译不会告诉您它是否在语法上有效):
重新编译AllStoredProcedures.prc
CREATE PROCEDURE dbo.RecompileAllStoredProcedures AS
DECLARE abc CURSOR FOR
SELECT ROUTINE_NAME
FROM INFORMATION_SCHEMA.routines
WHERE ROUTINE_TYPE = 'PROCEDURE'
OPEN abc
DECLARE @RoutineName varchar(128)
-- Build select string once
DECLARE @SQLString nvarchar(2048)
FETCH NEXT FROM abc
INTO @RoutineName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLString = 'EXECUTE sp_recompile '+@RoutineName
PRINT @SQLString
EXECUTE sp_ExecuteSQL @SQLString
FETCH NEXT FROM abc
INTO @RoutineName
END
CLOSE abc
DEALLOCATE abc
为了完整起见,UpdateAllStatistics 过程。这将通过执行完整的数据扫描来更新数据库中的所有统计信息:
RefreshAllStatistics.prc
CREATE PROCEDURE dbo.RefreshAllStatistics AS
EXECUTE sp_msForEachTable 'UPDATE STATISTICS ? WITH FULLSCAN'
【问题讨论】:
-
请注意您的标记。这是标记为“sqlserver”的站点上的唯一 问题。请改用“sql-server”。
-
您提议的程序将一些指向已重命名字段的程序视为“已成功标记为重新编译”。
-
@SergioPrats 是的。作为替代方案,我有应用程序代码 i) 从 sql server 获取存储过程定义片段 ii) 组装完整的
CREATE PROCEDUREsql iii) 在 iv) 上设置 no_exec 尝试更改存储过程。数据库将给出错误 v) 应用程序捕获错误并显示单元测试失败。
标签: sql-server stored-procedures maintenance