为什么SQL Server认为Temp Table已经存在?

Dan*_*ars 8 t-sql sql-server sql-server-2008-r2

背景:有一个存储过程,它使用给定名称的临时表来"填充".该过程是通用的,因为它检查临时表的模式,然后根据模式执行不同的"东西".我知道这有点奇怪,但我不愿意改变它,因为它在大多数情况下都能正常工作,除了....

如果我有一个存储过程,它为具有相同名称的临时表创建两个不同的模式.从逻辑上讲,它只根据IF的哪个分支创建一个临时表.问题是,当SQL Server检查Sproc时,似乎它正在评估IF的两端(如果它正在检查SQL语法,这是有意义的.)

所以这个SQL失败了:

IF (1=1)
BEGIN
    CREATE TABLE #test
    (
        a BIGINT NOT NULL,
        b BIGINT NOT NULL
    )
END 
ELSE
BEGIN
    CREATE TABLE #test
    (
        a BIGINT NOT NULL,
        b BIGINT NOT NULL,
        c BIGINT NOT NULL   
    )   
END

--exec SomeProcedureWhichDoesStuffWith#Test

DROP TABLE #test 
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

消息2714,级别16,状态1,行14
数据库中已存在名为"#test"的对象.

ifs内部(create table DDL之前或之后)的drop table的组合似乎不满足sql检查器.

我有什么想法可以做到这一点?例如,我可以告诉SQL不执行语法检查并按原样接受sproc吗?

Ric*_*iwi 7

这是一个限制.动态SQL也不起作用,因为#tmp将在新会话中创建并立即丢失.对于如图所示的EXACT片段,这也是如此

CREATE TABLE #test
(
    a BIGINT NOT NULL,
    b BIGINT NOT NULL
)

IF not (1=1)
    ALTER TABLE #test ADD c BIGINT NOT NULL   
Run Code Online (Sandbox Code Playgroud)

在同一批次中不能有两个CREATE .. #name,但这也可以在一般形式下工作

IF (1=1)
BEGIN
    CREATE TABLE #test
    (
        a BIGINT NOT NULL,
        b BIGINT NOT NULL
    );
END 
GO

IF NOT (1=1)
BEGIN
    CREATE TABLE #test
    (
        a BIGINT NOT NULL,
        b BIGINT NOT NULL,
        c BIGINT NOT NULL   
    )
END
Run Code Online (Sandbox Code Playgroud)