【问题标题】:Error Using Temporary Tables With Same Names SQL Server使用具有相同名称 SQL Server 的临时表时出错
【发布时间】:2012-07-19 14:37:37
【问题描述】:

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

DECLARE @date DATE

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))

If @date IS NULL

Insert into #TempList
Select mill_no, null, bl_status,footage from fn_A(0,0)

Select * from #TempList


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))

If @date IS NOT NULL

Insert into #TempList
Select * from fn_B(0,'06/06/2006')

Select * from #TempList

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

是否有替代方法来消除此错误?

【问题讨论】:

  • 为什么要删除并重新创建临时表?为什么不直接截断它?

标签: sql temp-tables


【解决方案1】:

根据提供的过程,您可以改用TRUNCATE TABLE

如果您只想快速删除记录,我认为删除和重新创建表没有任何意义。

编辑

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

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 

【讨论】:

  • 如果不删除它,我怎样才能拥有一个同名的临时表?
  • 虽然我很欣赏 truncate 删除我的#table 中的数据这一事实,但我不明白它的概念来解决我的问题。我的情况是从两个不同的函数(fn_A,fn_B)将数据插入到临时表(具有相同的名称)中。我无法这样做,因为我需要检查@date 是否为空或不在插入之前。
  • 为什么临时表要同名?
  • 因为临时表需要在存储过程中进一步调用。将对其应用一些附加功能。创建两个临时表会不必要地使我的功能变得多余和复杂。
【解决方案2】:

if object_id('tempdb..#TempList') 始终为 NULL,因为 #TempList 不是在您执行 create table #TempList 时在 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

【讨论】:

  • 那为什么 SQL 会说“数据库中已经有一个名为 '#TempList' 的对象。”?
  • 这个答案的第二部分是正确的,但第一部分不是。 OBJECT_ID 就像 OP 使用它一样工作。
  • SQL 说'已经有一个名为'#TempList'的对象,因为drop table #TempList 没有执行,因为object_id('tempdb..#TempList') 为空,因为tempdb..#TempList 不是引用该表的方法
  • @LuisSiquot - 你错了。测试一下。 Create table #TempList (x INT); SELECT object_id('tempdb..#TempList')
  • 我必须相信你,我现在无法访问 mssql
【解决方案3】:

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

鉴于我正在将 FoxPro(已声明游标)迁移到 SQL Server 的项目中,这个小逻辑需要在多个存储过程中实现。

最后,我从中学到的是 - 在尝试任何不同的东西之前先思考一下(对我的数据库迁移初学者的建议)。

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

感谢大家提供意见。希望这对某人有所帮助。

【讨论】:

  • 你的代码不正是我建议的吗?事实上,唯一的区别是检查#TempList 表是否存在。但是,请确保它是多余的,因为临时表具有存储过程范围
  • 当我得到自己的答案时,我确实考虑过你的答案(就像你建议的语法一样)..但是你建议截断数据,我的要求是重用同名的#table..
  • 那是另一个答案,我没有提到 TRUNCATE。您至少可以标记为好答案,因为您可以将许多答案标记为“好答案”
  • 我的道歉..我把你误认为 littlebobbytables.. 来回答你建议 object_id('tempdb..#TempList') 始终为空.. 如果是这样,我的代码将不会执行更多不止一次..另外,不要误会我的意思,我没有标记你的答案..我从不这样做..但谢谢你的意见..我现在正在做“回答有用” ..你的回答确实帮助我学到了新东西..
猜你喜欢
  • 2020-10-12
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多