无效的对象名称#temp

时间:2013-12-16 14:52:34

标签: sql-server tsql

我收到以下消息

     Invalid object name #alert 

备用运行具有以下代码的存储过程:

    IF OBJECT_ID('tempdb..#alert') IS NOT NULL
      DROP TABLE #alert
    ELSE
     create table #alert(order varchar(50))

    BULK INSERT #alert
    FROM 'C:\OrderImport\NewOne.txt'
    WITH 
    (
       FIELDTERMINATOR ='\t',
       ROWTERMINATOR ='\n',
       FIRSTROW = 2
     )

2 个答案:

答案 0 :(得分:2)

IF OBJECT_ID('tempdb..#alert') IS NOT NULL  
  DROP TABLE #alert

 create table #alert(order varchar(50))      

BULK INSERT #alert
FROM 'C:\OrderImport\NewOne.txt'
WITH 
(
   FIELDTERMINATOR ='\t',
   ROWTERMINATOR ='\n',
   FIRSTROW = 2
 )

只需删除ELSE,它将检查表的存在性,如果确实存在,则将其删除,然后创建一个新的,您不需要和ELSE语句。因为如果它不存在,那么控制将跳转到ELSE块,但如果它确实存在,控制将进入IF块丢弃表并跳过ELSE块,因为在IF .. ELSE块中只执行一个代码块。

IF OBJECT_ID('tempdb..#alert') IS NOT NULL  --<-- if not null      
 BEGIN
    DROP TABLE #alert                       --<-- Drops the table 
 END
ELSE
  CREATE TABLE                             --<-- This statement Never gets executed 
                                             -- since the control fell in the 1st block
                                            -- it never goes into ELSE Block

如果你想使用IF.. ELSE阻止,你可以做这样的事情......

IF OBJECT_ID('tempdb..#alert') IS NOT NULL        
 BEGIN
    DROP TABLE #alert
    create table #alert(order varchar(50))
 END
ELSE
  BEGIN
    create table #alert(order varchar(50))
  END 

答案 1 :(得分:1)

每次运行SP时,您的逻辑都会导致#alert被删除。第一次运行它时,它进入ELSE块并创建#alert表,因此其余的过程成功。下次运行时,它会进入IF块并删除先前创建的表,因此BULK INSERT #alert会失败。