怎样判断视图是否有效

telankes2000 2010-05-27 06:59:24
数据库里有很多以前写的视图,
当初那些视图所用到的表的结构有的已经改变了,
有的字段已经删除了, 现在再查询视图的时候就会报错
但又不知道有多少这样的视图
我写了个存储过程来检查有多少个有错误的视图
但是执行有错误

create PROC PROC_Validate_VIEW
AS
CREATE TABLE #TB(Tablename NVARCHAR(100))

DECLARE @Tablename NVARCHAR(100),@SQL NVARCHAR(200)

DECLARE CUR CURSOR FOR
SELECT NAME FROM SYSOBJECTS WHERE (XTYPE = 'V') ORDER BY NAME
OPEN CUR
FETCH NEXT FROM CUR INTO @Tablename
WHILE 1=1
BEGIN
IF(@@FETCH_STATUS<>0)BREAK;
SET @SQL = 'SELECT TOP 1 * into #temp FROM [' + @Tablename +']'
EXEC(@SQL)
IF(@@ERROR<>0)
BEGIN
INSERT INTO #TB
SELECT @Tablename--记录有错误的视图
END
ELSE
BEGIN--没有错的就删除临时表
DELETE FROM #temp--这里报错 临时表不存在 应该怎么写呢

END
FETCH NEXT FROM CUR INTO @Tablename
END
CLOSE CUR
DEALLOCATE CUR
SELECT * FROM #TB
DROP TABLE #TB

...全文
112 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
htl258_Tony 2010-05-27
  • 打赏
  • 举报
回复
--如果系统是SQL2005以上的,建议用这个过程:

ALTER PROC PROC_Validate_VIEW
AS
SET NOCOUNT ON
CREATE TABLE #TB
(
Tablename NVARCHAR(100)
)
DECLARE @Tablename NVARCHAR(100), @SQL NVARCHAR(200)
DECLARE CUR CURSOR FOR
SELECT NAME FROM SYSOBJECTS
WHERE (XTYPE='V')
ORDER BY NAME
OPEN CUR
FETCH NEXT FROM CUR INTO @Tablename
WHILE @@FETCH_STATUS=0
BEGIN
BEGIN TRY
SET @SQL = 'SELECT TOP 0 * into #t FROM ['+@Tablename+']'
EXEC (@SQL)
END TRY
BEGIN CATCH
INSERT INTO #TB SELECT @Tablename--记录有错误的视图
END CATCH
FETCH NEXT FROM CUR INTO @Tablename
END
CLOSE CUR
DEALLOCATE CUR
SELECT * FROM #TB
SET NOCOUNT OFF
GO

EXEC PROC_Validate_VIEW
htl258_Tony 2010-05-27
  • 打赏
  • 举报
回复
CREATE PROC  PROC_Validate_VIEW
AS
CREATE TABLE #TB
(
Tablename NVARCHAR(100)
)

DECLARE @Tablename NVARCHAR(100), @SQL NVARCHAR(200)

DECLARE CUR CURSOR FOR
SELECT NAME
FROM SYSOBJECTS
WHERE (XTYPE='V')
ORDER BY NAME
OPEN CUR
FETCH NEXT FROM CUR INTO @Tablename
WHILE @@FETCH_STATUS=0
BEGIN
SET @SQL = 'SELECT TOP 1 * into #temp FROM ['+@Tablename+']'
EXEC (@SQL)
IF (@@ERROR<>0)
BEGIN
INSERT INTO #TB
SELECT @Tablename--记录有错误的视图
END
FETCH NEXT FROM CUR INTO @Tablename
END
CLOSE CUR
DEALLOCATE CUR
SELECT *
FROM #TB
DROP TABLE #TB
GO
不需要再删除#temp,局部临时表在EXEC后会自动消失的。
pt1314917 2010-05-27
  • 打赏
  • 举报
回复

create PROC PROC_Validate_VIEW
AS
CREATE TABLE #TB(Tablename NVARCHAR(100))
DECLARE @Tablename NVARCHAR(100),@SQL NVARCHAR(200)
DECLARE CUR CURSOR FOR SELECT NAME FROM SYSOBJECTS WHERE (XTYPE = 'V') ORDER BY NAME
OPEN CUR
FETCH NEXT FROM CUR INTO @Tablename
WHILE(@@FETCH_STATUS=0)
BEGIN
SET @SQL = 'SELECT TOP 1 * into ##temp FROM [' + @Tablename +']'
EXEC(@SQL)
IF(@@ERROR<>0)
BEGIN
INSERT INTO #TB SELECT @Tablename
END
ELSE
BEGIN
DELETE FROM ##temp--可以换成全局临时表
END
FETCH NEXT FROM CUR INTO @Tablename
END
CLOSE CUR
DEALLOCATE CUR
SELECT * FROM #TB
go

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧