Sql 选择失败,列不相关

Sql 选择失败,列不相关,sql,sql-server,sql-server-2005,tsql,select,Sql,Sql Server,Sql Server 2005,Tsql,Select,使用SQL Server 2005 My tests is through SSMS执行以下语句会导致第一次执行成功,后续执行失败 IF OBJECT_ID('tempdb..#test') IS NULL CREATE TABLE #test ( GoodColumn INT ) IF 1 = 0 SELECT BadColumn FROM #test 这意味着在编译脚本时,有东西将我在select语句中访问的列与表中存在的列进行比较。就我而言,这是不

使用SQL Server 2005 My tests is through SSMS执行以下语句会导致第一次执行成功,后续执行失败

 IF OBJECT_ID('tempdb..#test') IS NULL 
    CREATE TABLE #test ( GoodColumn INT )
 IF 1 = 0 
    SELECT  BadColumn
    FROM    #test
这意味着在编译脚本时,有东西将我在select语句中访问的列与表中存在的列进行比较。就我而言,这是不受欢迎的功能。我的问题是,是否有什么方法可以让代码在每次运行时都能成功执行,或者如果不可能,也许有人可以解释为什么演示的功能是可取的。我目前唯一的解决方案是用EXEC或select*包装select,但我不喜欢这两种解决方案中的任何一种


感谢

从程序员的角度来看,这种行为是否可取当然是有争议的——它基本上归结为静态类型语言和动态类型语言之间的差异。从性能的角度来看,这是可取的,因为SQL Server需要完整的信息来编译和优化执行计划以及缓存执行计划

总之,T-SQL不是一种解释的或动态类型化的语言,因此您无法编写这样的代码。您可以选择使用EXEC,或者使用另一种语言并将SQL查询嵌入其中。

如果您将:

IF OBJECT_ID('tempdb..#test') IS NOT NULL 
  DROP TABLE #test
GO
开始时,问题将消失,因为批处理将在测试表存在之前得到解析

您所要求的是让系统认识到1=0的计算结果始终为false。如果这是真的,这可能是大多数现实生活中的情况,那么你可能想知道你将要运行一些会导致失败的东西

如果删除临时表,然后创建执行相同操作的存储过程:

CREATE PROC dbo.test 
AS
BEGIN
  IF OBJECT_ID('tempdb..#test') IS NULL 
    CREATE TABLE #test ( GoodColumn INT )

  IF 1 = 0 
    SELECT  BadColumn
    FROM    #test
END
然后,这将很高兴地被创建,并且您可以任意多次运行它


Rob

在以下情况下,此问题也很明显:

IF 1 = 1
    select dummy = GETDATE() into #tmp
ELSE 
    select dummy = GETDATE() into #tmp
尽管从未执行第二条语句,但仍会发生相同的错误。
查询引擎一级验证似乎忽略了所有条件语句。

您说后续请求有问题,这是因为对象已经退出。建议您在处理完临时表后尽快删除它

有关临时表性能的详细信息,请访问:

我在SQL中尝试了这两种解决方案,但都失败了,列名称“BadColumn”无效。如果临时对象不存在,则我可以创建此dbo.test进程,并重复运行它。如果临时对象存在,那么您将得到错误。+1作为良好的解释。此外,删除表意味着无法找到BadCOlumn,延迟的名称解析将应用于以后的使用。