对于我们支持的一个应用程序,我们有一个周二/周四的维护窗口。星期二我们修改一个设施,星期四如果没有错误,我们会将所有更改推广到其他设施。该应用程序是 3ed 方,有时会更改数据库,从而使应用程序的“报告”服务器上的视图无效。
有没有一种方法可以在我的报表服务器(大约有 70 个)上使用 TSQL 滚动浏览所有视图,以在星期二解聚后查找绑定错误?
我想找到的错误是:
以用户身份执行:<>。无法准备报表。[SQLSTATE 42000](错误 8180)由于绑定错误,无法使用视图或函数“PAT.dbo.Reorders”。[SQLSTATE 42000](错误 4413)使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询在其目标列表中必须具有相同数量的表达式。[SQLSTATE 42000](错误 205)。步骤失败。
有没有办法以编程方式执行此操作,或者我是否只需要右键单击每个视图并尝试查看它是否带有数据?
谢谢,
像下面这样的东西应该足以让你开始。它也应该很轻。
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)
归档时间: |
|
查看次数: |
2910 次 |
最近记录: |