检查存储过程是否存在语法错误

时间:2009-11-24 17:06:21

标签: sql sql-server-2008

我的数据库中有大量的存储过程。我们不断改变数据结构(我们正在开发中)是否有一个工具可以告诉我哪些存储过程不会编译?

创建存储过程时,如果存在无效的表或列,则会阻止您,但如果在创建存储过程后更改列名,则proc无效。我想得到那些无效过程的清单。

喝彩!

约瑟夫

4 个答案:

答案 0 :(得分:3)

您可以在CodeProject中使用此工具,该工具使用内置SQL函数和选项生成无效存储过程的文本文件。

http://www.codeproject.com/KB/database/validatingsql.aspx

答案 1 :(得分:1)

你最好的办法是编写一些数据库单元测试,如果你使用的是VS2008那么它很简单,但很费时间。

但是,您可以运行测试并确保所有内容都按预期工作,或者获取您需要查看的功能列表。

您可能会发现这篇关于数据库单元测试的文章很有意思,但我相信它可能需要VS Team System。:

http://www.developer.com/db/article.php/3758601/Introducing-Visual-Studio-Team-System-2008-Database-Unit-Testing.htm

答案 2 :(得分:0)

要进行监视的一项重大改进是拥有一个持续集成(CI),它可以每隔一段时间(可能每两小时或每天一次)检查数据库中的对象。另一种选择是创建一个调用端点的Windows服务。

CI或Windows服务可以在有人中断构建时向开发团队发送通知。

在该后端的端点中,您可以有一个类似的过程,该过程将通知您有关数据库中有错误的视图,存储过程和函数。

CREATE PROCEDURE Get_Objects_With_Errors 
AS

    SET NOCOUNT ON;
    DECLARE @objectName AS VARCHAR(255);

    DECLARE @count int = 0;

    -- Find all views in dbo schema
    DECLARE listViews CURSOR FOR
        SELECT [TABLE_NAME]
        FROM INFORMATION_SCHEMA.VIEWS v
        WHERE [TABLE_SCHEMA] = 'dbo';

    OPEN listViews
    FETCH NEXT FROM listViews into @objectName;

    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
        BEGIN TRY
            EXEC sp_refreshview @objectName;
        END TRY
        BEGIN CATCH
            PRINT @objectName + ' has ERRORS : ' + ERROR_MESSAGE();
            SET @count = @count + 1;
        END CATCH
        FETCH NEXT FROM listViews INTO @objectName;
    END

    CLOSE listViews;
    DEALLOCATE listViews;

    -- Find all procedures and functions in dbo schema
    DECLARE listRoutines CURSOR FOR
        SELECT SPECIFIC_NAME
        FROM INFORMATION_SCHEMA.ROUTINES
        WHERE SPECIFIC_SCHEMA = 'dbo' 
        GROUP BY SPECIFIC_NAME;

    OPEN listRoutines
    FETCH NEXT FROM listRoutines into @objectName;

    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
        BEGIN TRY
            EXEC sp_refreshsqlmodule @objectName;
        END TRY
        BEGIN CATCH
            PRINT @objectName + ' has ERRORS : ' + ERROR_MESSAGE();
            SET @count = @count + 1;
        END CATCH
        FETCH NEXT FROM listRoutines INTO @objectName;
    END

    CLOSE listRoutines;
    DEALLOCATE listRoutines;

    PRINT 'Total with errors : ' + CAST(@count AS nvarchar(10));

SET NOCOUNT OFF;

答案 3 :(得分:-1)

Create procedure data_tranfer
(@C1 int)
AS
BEGIN
INSERT INTO coindesk
(UPDATED,
UPDATEDISO,
UPDATEDUK,
USDCODE,
USDSYMBOL,
USDRATE,
USDDESCRIPTION,
USDRATE_FLOAT,
GBPCODE,              
GBPSYMBOL,
GBPRATE,           
GBPDESCRIPTION,     
GBPRATE_FLOAT,         
EURCODE,           
EURSYMBOL,            
EURRATE,           
EURDESCRIPTION,      
EURRATE_FLOAT)
SELECT UPDATED,
UPDATEDISO,
UPDATEDUK,
USDCODE,
USDSYMBOL,
USDRATE,
USDDESCRIPTION,
USDRATE_FLOAT,
GBPCODE,              
GBPSYMBOL,
GBPRATE,           
GBPDESCRIPTION,     
GBPRATE_FLOAT,         
EURCODE,           
EURSYMBOL,            
EURRATE,           
EURDESCRIPTION,      
EURRATE_FLOAT
FROM stagcoindesk
WHERE C1 = @C1
END;