【发布时间】:2011-01-28 12:35:02
【问题描述】:
背景:有一个存储过程可以使用给定名称的临时表“填充”。该过程是通用的,因为它检查临时表的架构,然后根据架构执行不同的“东西”。我知道这有点奇怪,但我不愿意更改它,因为它在大多数情况下都可以正常工作,除了......
如果我有一个存储过程,它为同名的临时表创建两个不同的模式。从逻辑上讲,它只根据 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
出现以下错误:
消息 2714,第 16 级,状态 1,第 14 行
已经有一个对象名为 数据库中的“#test”。
ifs 中的 drop table 组合(在创建表 DDL 之前或之后)似乎无法满足 sql 检查器的要求。
有什么想法可以做到这一点吗?例如,我可以告诉 SQL 不执行语法检查而直接接受存储过程吗?
【问题讨论】:
标签: sql-server tsql sql-server-2008-r2