SQL:TSQL 查找无效视图

use*_*240 3 t-sql

对于我们支持的一个应用程序,我们有一个周二/周四的维护窗口。星期二我们修改一个设施,星期四如果没有错误,我们会将所有更改推广到其他设施。该应用程序是 3ed 方,有时会更改数据库,从而使应用程序的“报告”服务器上的视图无效。

有没有一种方法可以在我的报表服务器(大约有 70 个)上使用 TSQL 滚动浏览所有视图,以在星期二解聚后查找绑定错误?

我想找到的错误是:

以用户身份执行:<>。无法准备报表。[SQLSTATE 42000](错误 8180)由于绑定错误,无法使用视图或函数“PAT.dbo.Reorders”。[SQLSTATE 42000](错误 4413)使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询在其目标列表中必须具有相同数量的表达式。[SQLSTATE 42000](错误 205)。步骤失败。

有没有办法以编程方式执行此操作,或者我是否只需要右键单击每个视图并尝试查看它是否带有数据?

谢谢,

Ava*_*rkx 9

像下面这样的东西应该足以让你开始。它也应该很轻。

DECLARE @Name       NVARCHAR( MAX ),
        @SQL        NVARCHAR( MAX );

DECLARE @t_BindingErrors TABLE
(
    ViewName        NVARCHAR( MAX ),
    ErrorMessage    NVARCHAR( MAX )
);

DECLARE c CURSOR 
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR SELECT  '[' + ss.name + '].[' + so.NAME + ']'
    FROM    sys.schemas ss
    INNER JOIN sys.objects so
        ON  ss.schema_id = so.schema_id
    WHERE   so.type = 'V';
OPEN    c;
FETCH NEXT FROM c 
INTO    @Name;

WHILE ( @@FETCH_STATUS = 0 )
BEGIN
    SET @SQL = '
        DECLARE @i  INTEGER;
        SELECT  TOP ( 0 ) @i = 1
        FROM    ' + @Name + ';';
    BEGIN TRY
        EXECUTE dbo.sp_executesql @statement = @SQL;
    END TRY BEGIN CATCH
        INSERT INTO @t_BindingErrors
        VALUES ( @Name, ERROR_MESSAGE() );
    END CATCH;  

    FETCH NEXT FROM c 
    INTO    @Name;
END;

CLOSE   c;
DEALLOCATE c;

SELECT  *
FROM    @t_BindingErrors;
Run Code Online (Sandbox Code Playgroud)