加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 语法检查所有存储过程?

发布时间:2020-12-12 16:33:57 所属栏目:MsSql教程 来源:网络整理
导读:我想确保所有存储过程在语法上仍然有效. (如果有人重命名/删除表/列,则可能会发生这种情况). 现在我检查所有存储过程的语法的解决方案是进入企业管理器,选择列表中的第一个存储过程,并使用以下过程: 输入 Alt C 逃脱 逃脱 向下箭头 转到1 它的作品,但它是相
我想确保所有存储过程在语法上仍然有效. (如果有人重命名/删除表/列,则可能会发生这种情况).

现在我检查所有存储过程的语法的解决方案是进入企业管理器,选择列表中的第一个存储过程,并使用以下过程:

>输入
> Alt C
逃脱
逃脱
>向下箭头
>转到1

它的作品,但它是相当乏味.我想要一个叫做的存储过程

SyntaxCheckAllStoredProcedures

像我写的其他存储过程一样,对于视图也是一样的:

RefreshAllViews

为了大家的好处,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

为了所有人的好处,存储过程将所有存储过程标记为需要重新编译(标记重新编译的存储过程将不会告诉您是否在语法上有效):

RecompileAllStoredProcedures.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'

解决方法

你也可以这样做“就地” – 没有得到所有的创建语句.

除了设置NOEXEC ON之外,您还需要设置您喜欢的SHOWPLAN_ * ON(我使用SHOWPLAN_TEXT).现在您可以摆脱步骤2,只需执行您在步骤1中检索的每个过程.

以下是使用单个存储过程的示例.您可以将其加工到您最喜欢的循环中:

create procedure tests @bob int as 
select * from missing_table_or_view
go 

set showplan_text on; 
go 

set noexec on 

exec tests 

set noexec off 
go 
set showplan_XML off 
go 
drop procedure tests 
go

上述示例应生成以下输出:

Msg 208,Level 16,State 1,Procedure tests,Line 2 Invalid object name ‘missing_table_or_view’.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读