我在我的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
答案 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