if和else语句都在执行

时间:2011-06-02 17:53:19

标签: sql sql-server-2005

我在我的sql中有这个查询

if (select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS')) = 4
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0    --old version
else 
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0, 1 --new version

select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS')的结果为4,但它似乎总是执行查询的5参数else版本。

我的if语句出了什么问题?

更新

它似乎正在运行这两个语句,因为如果我这样做

if (select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS')) = 5
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0, 1 --new version
else 
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0    --old version

我得到了同样的错误,但现在它说它正在做第一个声明。

UPDATE2: Mikael Eriksson得到了正确的答案,我将我的代码改为此修复它。

if ((select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS')) = 5)
    execute ('insert into CLIENT_STATUS select ''NA'', ''Inactive'', 0, 0, 1') --new version
else
    execute ('insert into CLIENT_STATUS select ''NA'', ''Inactive'', 0, 0')    --old version

3 个答案:

答案 0 :(得分:6)

SQL Server编译语句时会出现错误。

使用此表

create table TestTable(ID int)

尝试运行此声明

if 1 = 1
  insert into TestTable values (1)
else
  insert into TestTable values(1, 2)  

结果:

Msg 213, Level 16, State 1, Line 4
Column name or number of supplied values does not match table definition.

显然,第二个语句永远不会执行,但会被编译。

答案 1 :(得分:0)

我认为它与你的括号有关,你关闭你的if语句然后将它与5进行比较。

您可以尝试进行调试:

declare @myCount as int
select @myCount = select count(*) from sys.columns where object_id = (select object_id from sys.tables where name = 'CLIENT_STATUS';
print @myCount

if (@myCount = 5)
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0, 1 --new version
else 
    insert into CLIENT_STATUS select 'NA', 'Inactive', 0, 0    --old version

这将帮助您确保从选择中获得的价值。

答案 2 :(得分:0)

我正在解决一个老问题,但是我遇到一个问题,即如果它从未到达ELSE语句,我就不想编译它,并发现上面的动态SQL建议不再起作用。我发现,使用GOTO命令可以避免编译ELSE语句(如果不需要)。这是一个示例:

IF (1 = 1) 
    GOTO SUCCESS;
ELSE GOTO ERROR;

ERROR:
    PRINT 'Oh no, an error'
    SELECT 1 + 'A'
SUCCESS:
    PRINT 'Yay no errors'

这将永远不会出错,因为ERROR:分支将永远不会被编译。

请记住,如果您不想像我一样在出错时中断执行,则必须再次使用GOTO跳过SUCCESS:分支。例如:

IF (1 <> 1) 
    GOTO SUCCESS;
ELSE GOTO ERROR;

ERROR:
    PRINT 'Oh no, an error'
    GOTO FINAL
SUCCESS:
    PRINT 'Yay no errors'
FINAL:
    PRINT 'Oh well'

返回:

Oh no, an error
Oh well