在SQL中检查IF条件,即使它不匹配

时间:2017-05-25 14:53:04

标签: sql sql-server if-statement view

我的代码中有条件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只检查视图是否存在依赖关系。

2 个答案:

答案 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