我在这个SQL代码上失去了理智。使用简单的PRINT语句进行测试时,下面的IF ELSE语句正常运行,即表不存在,因此它打印'FALSE'。但是当我取消注释SET语句并执行时,它会尝试运行SET语句,并自然地给出和错误,因为该表不存在。
DECLARE @zeus_calls310_counter int;
IF EXISTS (SELECT * FROM [zeus].tpza.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'calls_310')
BEGIN
--SET @zeus_calls310_counter = (SELECT COUNT(*) FROM [zeus].[tpza].[dbo].[calls_310]);
PRINT 'TRUE'
END
ELSE
BEGIN
PRINT 'FALSE';
END
答案 0 :(得分:5)
您的标题表明您的理解出错的地方。如果表不存在,则SET
语句不会运行并发出错误;当语句解析时,就会出现错误。
每当你运行一些SQL时,服务器首先解析该语句,然后,如果解析成功,运行它。所以你不能拥有依赖于表存在的裸SQL!无论表是否存在,您的SET
语句都将解析 - 所以当它不存在时,解析失败。
对此的一个解决方案是包装那些依赖于EXEC
中可能存在或不存在的对象的语句。但是,在这种情况下,您希望使用该表上的查询结果填充变量,并在EXEC
内部该变量不在范围内。所以我们需要更多关于你正在做什么的详细信息@zeus_calls310_counter
- 如果它将在不久之后使用,也许你可以把整个事情,包括它的声明,包装在EXEC
中
答案 1 :(得分:2)
@AAkashM走在正确的轨道上。
如果使用EXEC sp_executesql,您还可以指定OUTPUT参数,在您的情况下,这些参数将包含SELECT COUNT
语句的结果。
答案 2 :(得分:-1)
试试这个:
DECLARE @zeus_calls310_counter int;
IF EXISTS (SELECT * FROM [zeus].tpza.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'calls_310')
BEGIN
SET @zeus_calls310_counter = (SELECT COUNT(*) FROM [zeus].[tpza].[calls_310]);
PRINT 'TRUE'
END
ELSE
BEGIN
PRINT 'FALSE';
END
答案 3 :(得分:-1)
用它来检查表是否存在
IF OBJECT_ID(N'[zeus].[table_name]', N'U') IS NULL
BEGIN
--
END
ELSE
BEGIN
--
END