[sql-server] 임시 테이블을 작성하기 전에 임시 테이블이 있는지 확인하고 존재하는 경우 삭제하십시오.

다음 코드를 사용하여 임시 테이블이 있는지 확인하고 테이블을 다시 만들기 전에 테이블을 삭제하십시오. 열을 변경하지 않는 한 제대로 작동합니다. 나중에 열을 추가하면 “잘못된 열”이라는 오류가 발생합니다. 내가 뭘 잘못하고 있는지 알려주세요.

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

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
)

select company, stepid, fieldid from #Results

--Works fine to this point

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

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
    NewColumn            NVARCHAR(50)
)

select company, stepid, fieldid, NewColumn from #Results

--Does not work



답변

오류를 재현 할 수 없습니다.

아마도 문제를 이해하지 못했을 것입니다.

다음은 SQL Server 2005에서 두 번째 선택 결과에 추가 “foo”열이 표시되어 제대로 작동하는 것입니다.

IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT )
GO
select company, stepid, fieldid from #Results
GO
ALTER TABLE #Results ADD foo VARCHAR(50) NULL
GO
select company, stepid, fieldid, foo from #Results
GO
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO


답변

진술서는 순서대로 이루어져야한다

  1. 테이블 변경 문
  2. 가다
  3. 문장을 선택하십시오.

사이에 ‘GO’가 없으면 전체가 하나의 단일 스크립트로 간주되며 select 문이 열을 찾을 때 찾을 수 없습니다.

‘GO’를 사용하면 스크립트의 일부를 ‘GO’까지 단일 배치로 간주하여 ‘GO’이후 쿼리에 들어가기 전에 실행됩니다.


답변

dropping임시 테이블을 재생성 하는 대신 truncate재사용 할 수 있습니다.

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    Truncate TABLE #Results
else
    CREATE TABLE #Results
    (
        Company             CHAR(3),
        StepId              TINYINT,
        FieldId             TINYINT,
    )

사용 Sql Server 2016하거나 Azure Sql Database다음 구문을 사용하여 임시 테이블을 삭제하고 다시 작성하십시오. 자세한 내용은 여기 MSDN

통사론

DROP TABLE [존재하는 경우] [database_name. [schema_name]. | schema_name ] table_name [, … n]

질문:

DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
  (
   Company             CHAR(3),
   StepId              TINYINT,
   FieldId             TINYINT,
  )


답변

문제는 실행을 배치로 분리하기 위해 사이에 GO 문을 추가해야한다고 생각합니다. 두 번째 삭제 스크립트로 즉 IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results, 임시 테이블을 단일 배치의 일부로 삭제하지 않았습니다. 아래 스크립트를 사용해보십시오.

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

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
)

GO

select company, stepid, fieldid from #Results

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

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
    NewColumn            NVARCHAR(50)
)

GO

select company, stepid, fieldid, NewColumn from #Results


답변

이는 한 줄의 코드로 수행 할 수 있습니다.

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


답변

이것은 나를 위해 일했다 :
social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof= 필수

if exists (
    select  * from tempdb.dbo.sysobjects o
    where o.xtype in ('U')

   and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;


답변

OBJECT_ID나를 위해 작동하지 않기 때문에 내 측면에서 약간의 의견 . 항상

`#tempTable이 존재하지 않습니다

그것이 비록 ..even 않습니다 존재합니다. 방금 다른 이름 ( _밑줄로 접두사)이 저장되어 있음을 알았습니다 .

#tempTable________

이것은 나를 위해 잘 작동합니다 :

IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
   DROP TABLE #tempTable;
END;