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