【发布时间】:2020-01-18 04:49:04
【问题描述】:
我有以下示例数据。
--表格:
create table mtest1
(
id int,
name varchar(10)
);
create table mtest2
(
id int,
name varchar(10)
);
create table mtest3
(
id int,
name varchar(10)
);
insert into mtest1 values(1,'mtest1');
insert into mtest2 values(1,'mtest2');
insert into mtest3 values(1,'mtest3');
--观看次数:
create view mview1
as
select * from mtest1
create view mview2
as
select * from mtest1
union all
select * from mtest2
create view mview3
as
select * from mtest1
union all
select * from mtest2
union all
select * from mtest3
注意:现在我想创建一个包含所有其他名为mviewall 的视图的视图。在创建视图mviewall 之间,一些表被删除
我想在创建视图mviewall 时处理这个异常。
例如:我重命名或删除了在视图mview2 和mview3 中引用的表mtest2,并且我想更改那些出现无效对象错误mtest2 的视图。
我的尝试:
--Procedure : 创建视图mviewall
alter procedure spmtest_createView
as
begin
declare @ErrorTable varchar(max)=''
declare @ErrorView varchar(max) = ''
declare @sql varchar(max) = ''
begin try
if exists(select 1 from sys.views where name='mviewall' and type='v')
drop view mviewall;
set @sql = '
create view mviewall
as
select * from mview1
union all
select * from mview2
union all
select * from mview3';
print(@sql);
exec(@sql);
end try
begin catch
SELECT @ErrorTable = ERROR_MESSAGE(), @ErrorView = ERROR_PROCEDURE();
SELECT @ErrorTable = REPLACE(@ErrorTable,'''','');
SELECT @ErrorTable = SUBSTRING(@ErrorTable,CHARINDEX('dbo.',@ErrorTable),LEN(@ErrorTable)-CHARINDEX('dbo.',@ErrorTable))
SELECT @ErrorTable = REPLACE(@ErrorTable,'dbo.','');
print(@ErrorTable);
print(@ErrorView);
exec spalterview @ErrorTable,@ErrorView;
end catch
end
--过程:改变视图
alter procedure spalterview
@ErrorTable varchar(255),
@ErrorView varchar(255)
as
begin
DECLARE @Tables VARCHAR(MAX) = ''
DECLARE @DSQL VARCHAR(MAX) = ''
SELECT @Tables = STUFF((SELECT ' SELECT * FROM [dbo].['+vt.TABLE_NAME+'] UNION ALL '
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE vt
INNER JOIN INFORMATION_SCHEMA.TABLES tbl ON vt.TABLE_NAME = tbl.TABLE_NAME AND vt.TABLE_CATALOG = tbl.TABLE_CATALOG
WHERE VIEW_NAME = @ErrorView AND vt.TABLE_NAME <> @ErrorTable
FOR XML PATH('')),1,1,' ')
SET @Tables = LEFT(@Tables,LEN(@Tables)-10);
SET @DSQL = 'ALTER VIEW ['+@ErrorView+'] AS
'+@Tables+';';
print(@DSQL);
EXEC(@DSQL);
exec spmtest_createView; --Calling this because of multiple exception may occur
end
--重命名表:
exec sp_rename 'mtest2', 'mtest22';
--执行SP:
exec spmtest_createView;
--获取视图数据:
select * from mviewall;
但是拿不到。
【问题讨论】:
标签: sql-server tsql sql-server-2008-r2