我的代码中有条件2。如果它属于条件号1,它会从某个视图执行选择并且没有问题。但是,如果它属于条件号2,它会从另一个视图中选择,该视图已被破坏(尽管它存在),因为它引用了一个不再存在的表中的列。
我的目的是不打扰修复视图(或删除它),因为我有一个操作变量的逻辑,使其落在引用工作视图的条件下。
但是,似乎SQL验证了代码中的所有视图,即使它位于永远不会执行的IF块内,也会生成错误:
Msg 207, Level 16, State 1, Procedure vtest_table, Line 21
Invalid column name 'name'.
Msg 4413, Level 16, State 1, Line 32
Could not use view or function 'vtest_table' because of binding errors.
示例:
create database test
create table test_table (
id int identity(1,1),
name varchar(20)
)
go
create view vtest_table
as
select id, name
from test_table
go
-- breaking the view
alter table test_table
drop column name
go
declare @var int
set @var = 2
if (@var = 2) -- it should fall under this condition and execute this block
begin
print 'test'
end
-- however, the view in the select statement in this block is checked, and as the view is broken, it returns the error.
else if (@var = 1)
begin
select * from vtest_table
end
值得注意的是:如果我引用一个根本不存在的观点,请说:
else if (@var = 1)
begin
select * from viewthatdoesntexist
end
它正确执行。似乎SQL只检查视图是否存在依赖关系。
答案 0 :(得分:1)
更新您的视图,因为您从表格中删除了名称列
alter view vtest_table
as
select id
from test_table
答案 1 :(得分:1)
SQL是一种声明性语言而非命令式,所以有......我只是将视图的引用全部删除或将其包装在TRY / CATCH
块中。
begin try
exec('select * from vtest_table')
end try
begin catch
print 'your try failed'
end catch