【问题标题】:Unable to create temp table with same name but in different condition无法创建具有相同名称但条件不同的临时表
【发布时间】:2020-10-12 15:46:26
【问题描述】:

如果 cnt=1,那么我想在 cnt = 2 时创建一个包含 2 列的临时表,然后我想要一个包含 3 列但名称与下面相同的临时表。

Declare @cnt int
Set @cnt = 2

IF @cnt = 1
Begin
if OBJECT_ID('tempdb..#temptest') is not null drop table #temptest;
create table #temptest
(   ID int,
    M1 char(2)
);
end


IF @cnt = 2
begin

if OBJECT_ID('tempdb..#temptest') is not null drop table #temptest;
create table #temptest
(   ID int,
    M1 char(2),
    M2 char(2)
);
end

遇到错误

'数据库中已经有一个名为'#temptest'的对象。

如何做到这一点..请帮忙?

【问题讨论】:

  • 解析器会在你的逻辑被检查之前阻止你这样做(见this question for some background)。即使您这样做(例如动态生成创建表),您仍然无法在代码的后面部分引用 M2,除非所有该代码 使用动态 SQL。 @cnt = 2 时为什么不创建所有三列并忽略第三列?
  • @shivkumar 。 . .创建包含两列的临时表,并在必要时使用alter table 添加额外的列。
  • @Gordon 但是如果你以后有引用M2的代码,当@cnt = 1时它会失败。在这种情况下,如果您必须用相同的 IF 逻辑包围后面的每个语句,不妨创建两个不同的表。
  • @shivkumar 您还可以找到更多详细信息here
  • @AaronBertrand/Gordon linoff 感谢您的 cmets。是的,我正在使用 alter table 根据 IF 条件添加额外的列并且它正在工作。我也在动态 sql 中使用这些表来执行。

标签: sql sql-server sql-server-2012 temp-tables


【解决方案1】:

最简单的解决方案是使用所需的最少列创建临时表,然后根据@cnt 的值添加必要的列。试试这个:

DECLARE @cnt int
SET @cnt = 2

IF OBJECT_ID('tempdb..#temptest') is not null DROP TABLE #temptest;
CREATE TABLE #temptest
(   ID int,
    M1 char(2)
);

IF @cnt = 2
BEGIN

ALTER TABLE #temptest
ADD M2 char(2)

END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多