使用与SQL Server同名的临时表时出错

使用与SQL Server同名的临时表时出错,sql,temp-tables,Sql,Temp Tables,这是我的设想。(以下是以@date作为输入参数的存储过程) 我从一篇博文中发现,除非包含GO,否则我不能使用具有相同名称的临时表。但是,包括GO在内的参数并不是我试图传递的参数 是否有其他方法来消除此错误?根据提供的过程,您可以使用截断表 如果您只想快速删除记录,我认为没有必要删除并重新创建表 编辑 您不会删除并重新创建具有相同名称的表;而不是此代码: If object_id('tempdb..#TempList') is not null drop table #TempList go

这是我的设想。(以下是以@date作为输入参数的存储过程)

我从一篇博文中发现,除非包含GO,否则我不能使用具有相同名称的临时表。但是,包括GO在内的参数并不是我试图传递的参数


是否有其他方法来消除此错误?

根据提供的过程,您可以使用
截断表

如果您只想快速删除记录,我认为没有必要删除并重新创建表

编辑

您不会删除并重新创建具有相同名称的表;而不是此代码:

If object_id('tempdb..#TempList') is not null drop table #TempList go  
Create Table #TempList (
    MILL_NO VARCHAR(7), 
    SHIP_DATE DATE, 
    BL_STATUS NCHAR(1), 
    FOOTAGE DECIMAL(12,4)
)
只要这样做:

TRUNCATE TABLE #TempList 
如果object_id('tempdb..#templast')
始终为空,因为当您执行
创建表#templast
时,
templast
不是在tempdb的sysobjects表上创建的名称

编辑
那么这个呢:

CREATE PROC PIRULO(@date as DATE) as

Create table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), FOOTAGE DECIMAL(12,4))
IF @date IS NULL
    Insert into #TempList
    Select mill_no, null, bl_status,footage from fn_A(0,0)
ELSE
    Insert into #TempList
    Select * from fn_B(0,'2006/06/06')    -- also I changed date order.

Select * from #TempList

这些天来,当满足给定条件时,我一直在努力将值插入到同一个临时表中

考虑到我正在执行一个将FoxPro(到处都声明了游标)迁移到SQL Server的项目,这个小逻辑需要在多个存储过程中实现

最后,我从中学到的是——在尝试任何不同的东西之前,请先想清楚(向我的DB迁移合作初学者提出建议)


感谢大家的投入。希望这对其他人有所帮助。

为什么要删除并重新创建临时表?为什么不干脆截断它呢?如果不删除它,我怎么能有一个同名的临时表呢?虽然我很欣赏截断删除我的#表中的数据这一事实,但我不理解它的概念来解决我的问题。我的情况是从两个不同的函数(fn_A,fn_B)将数据插入临时表(具有相同的名称)。我无法做到这一点,因为我需要在插入之前检查@date是否为null。为什么临时表必须具有相同的名称?因为临时表需要在存储过程中进一步调用。将在其上应用一些附加功能。创建两个临时表将不必要地使我的功能变得冗余和复杂。那么为什么SQL会说“数据库中已经有一个名为“#templast”的对象?”?答案的第二部分是正确的,但第一部分不是
OBJECT\u ID
在OP使用它时起作用。SQL说“已经有一个名为“\templast”的对象,因为
drop table\templast
没有执行,因为
OBJECT\u ID('tempdb..\templast')
为空,因为
tempdb..\templast
不是引用它的方法table@LuisSiquot-你错了。测试一下<代码>创建表#模板列表(x INT);选择object_id('tempdb..#templast')我必须相信你,我现在无法访问mssql,你的代码不正是我建议的吗??事实上,唯一的区别是检查是否存在#templast表。但是,请确保它是多余的,因为临时表有存储过程作用域。当我得到自己的答案时,我确实考虑过你的答案(从语法上说,你建议的是相同的)。。但您建议截断数据,我的要求是重用同名的#表。这是另一个问题,我没有提到截断。你至少可以标记为一个好的anwser,就像你可以标记许多anwser为“好答案”一样。我向你道歉。。我把你错当成小桌子了。。在回答问题时,您建议对象id(“tempdb..templast”)始终为空。。如果是这种情况,我的代码将不会执行多次。。还有,别误会我,我没有记下你的答案。。我从不那样做。。但是谢谢你的意见。。我现在正在做“有用的回答”。。你的回答确实帮助我学到了一些新东西。。
CREATE PROC PIRULO(@date as DATE) as

Create table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), FOOTAGE DECIMAL(12,4))
IF @date IS NULL
    Insert into #TempList
    Select mill_no, null, bl_status,footage from fn_A(0,0)
ELSE
    Insert into #TempList
    Select * from fn_B(0,'2006/06/06')    -- also I changed date order.

Select * from #TempList
DECLARE @date DATE

SET @date = '06/06/2006'    --@date = null

If object_id('tempdb..#TempList') is not null drop table #TempList

Create table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), 
FOOTAGE DECIMAL(12,4))

If @date = null

-- Here I am inserting null in place of Ship_Date because fn_A returns only 3 columns in my case
Insert into #TempList
Select mill_no, null, bl_status,footage from fn_A(0,0)

--Select * from #TempList

else

Insert into #TempList
Select * from fn_B(0,@date)

Select * from #TempList