gpt4 book ai didi

sql-server - 为什么 SQL Server 认为临时表已经存在,而实际上它并不存在?

转载 作者:行者123 更新时间:2023-12-02 12:35:51 25 4
gpt4 key购买 nike

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

如果我有一个存储过程,它为同名的临时表创建两个不同的架构。从逻辑上讲,它仅根据 IF 的哪个分支创建一个临时表。问题是,当 SQL Server 检查存储过程时,它似乎正在评估 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

出现以下错误:

Msg 2714, Level 16, State 1, Line 14
There is already an object named '#test' in the database.

ifs 内的 drop table 组合(在创建表 DDL 之前或之后)似乎无法满足 sql 检查器的要求。

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

最佳答案

这是一个限制。动态 SQL 也不起作用,因为 #tmp 将在新 session 中创建并立即丢失。对于如图所示的确切代码片段,这会执行相同的操作

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

IF not (1=1)
ALTER TABLE #test ADD c BIGINT NOT NULL

同一批处理内不能有两个 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

关于sql-server - 为什么 SQL Server 认为临时表已经存在,而实际上它并不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4828261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com