복붙노트

[SQL] 데이터베이스에 '#columntable'라는 개체가 이미 있습니다

SQL

데이터베이스에 '#columntable'라는 개체가 이미 있습니다

나는 다음과 같은 쿼리를 시도하고있다

   if exists (select 1  from emp where eid = 6)     
     begin
        if object_id('tempdb..#columntable') is not null 
          begin 
             drop table #columntable                         
          end                     
        create table #columntable (oldcolumns varchar(100))   
     end
  else
     begin
        if object_id('tempdb..#columntable') is not null 
          begin 
             drop table #columntable            
          end     


    create table #columntable (newcolumns varchar(100))   
 end

하지만 오류를 얻고있다

Msg 2714, Level 16, State 1, Line 8
There is already an object named '#columntable' in the database.

사람이 왜 제안 할 수 있습니까? 나는 다른 부분을 작성하지 않는 경우 동일한 쿼리가 잘 작동합니다.

해결법

  1. ==============================

    1.임시 테이블 쿼리의 끝에서 자동으로 삭제되지는 DB에 현재 연결 떨어 뜨리거나 경우에만 명시 적 DROP의 표 #columntable로 삭제

    임시 테이블 쿼리의 끝에서 자동으로 삭제되지는 DB에 현재 연결 떨어 뜨리거나 경우에만 명시 적 DROP의 표 #columntable로 삭제

    쿼리 나 alwayas의 시작 테이블의 존재에 대한 어느 시험 (모두 바람직) 끝에 삭제

    편집 :로 Matrin 그의 주석에서이 실제로 구문 분석 오류가 발생했다. 당신은 단지 당신이 그것을 실행할 때와 SQL 구문 분석 경우 동일한 오류가 발생합니다.

    밖으로하는지 테스트하려면 난 당신의 쿼리를 분할하고 시도 :

    if exists (select 1 from emp where id = 6)
      create table #columntable (newcolumns varchar(100))
    GO
    if not exists (select 1 from emp where id = 6)
      create table #columntable (oldcolumns varchar(100))
    GO
    

    파서는 행복입니다. 이 아닌 임시 테이블을 원래 쿼리 구문 분석의 벌금을 사용하여 변경하면 흥미롭게도 (내가 쿼리 구문 분석하지 않을 이유를 찾기에만 관심이 있었다, 만들 것이다 문제를 실현).

  2. ==============================

    2.이것은 불행하게도 (Microsoft에서 확인)을 SQL 서버 파서 오류입니다.

    이것은 불행하게도 (Microsoft에서 확인)을 SQL 서버 파서 오류입니다.

    또한 @DizGrizz이다 권리 - SELECT ... INTO #SomeTable는 IF 반복하면 작업 ... ELSE 문하지 않습니다.

    실제 질문에 대답 한 후 생성 테이블 작품을 변경에서 (당신은 또한만을 확인하고 한 번에 드롭해야한다) ...

    IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL
    BEGIN 
         DROP TABLE #MyTempTable
    END  
    
    CREATE TABLE #MyTempTable (DummyColumn BIT)
    
    IF EXISTS (SELECT 1 FROM EMP WHERE EID = 6)     
        BEGIN
            ALTER TABLE #MyTempTable
            ADD MyColumnType1 VARCHAR(100)
    
            ALTER TABLE #MyTempTable
            DROP COLUMN DummyColumn
        END
    ELSE
        BEGIN
            ALTER TABLE #MyTempTable 
            ADD MyColumnType2 VARCHAR(100)
    
            ALTER TABLE #MyTempTable
            DROP COLUMN DummyColumn
        END
    

    나는 그러나 한 문제는 @DizGrizz과 동일 : IF ... ELSE SELECT와 함께 ... INTO #SomeTable이 실패합니다. A는 해결 방법으로는 정확한 열 유형 테이블을 작성 상단 행 0 (즉 없음)을 선택하는 것이 가능하다. (이 컬럼 형으로 변경 스크립트 단열 또한 모든 유형 선언의 고통을 피할 수있다.) INSERT INTO 후 사용할 수 IDENTITY_INSERT 오류를 방지하기 위해 ON으로 설정되어 제공 :

    IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL
        DROP TABLE #MyTempTable
    
    -- This creates the table, but avoids having to declare any column types or sizes
    SELECT TOP 0 KeyNm
    INTO #MyTempTable
    FROM dbo.MyDataTable2
    
    -- Required to prevent IDENTITY_INSERT error
    SET IDENTITY_INSERT #MyTempTable ON
    
    IF @something = 1
        BEGIN
            -- Insert the actual rows required into the (currently empty) temp table
            INSERT INTO #MyTempTable (KeyNm)
            SELECT KeyNm
            FROM dbo.MyDataTable2
            WHERE CatNum = 2
        END
    ELSE
        BEGIN
            -- Insert the actual rows required into the temp table
            INSERT INTO #MyTempTable (KeyNm)
            SELECT KeyNm
            FROM dbo.MyDataTable2
            WHERE CatNum = 8
        END
    
    SET IDENTITY_INSERT #MyTempTable OFF
    
  3. ==============================

    3.당신이 SELECT INTO와 테이블을 작성하는 경우에도 같이 ... 발생

    당신이 SELECT INTO와 테이블을 작성하는 경우에도 같이 ... 발생

    IF OBJECT_ID('tempdb..#MyTempTable', 'U') IS NOT NULL
        DROP TABLE #MyTempTable
    SELECT TOP 1 @MyVariable = ScaleValue
        FROM MyDataTable1
        WHERE ProductWeight > 1000
    IF @MyVariable = 1
    BEGIN
        SELECT KeyNm
            INTO #MyTempTable
            FROM dbo.MyDataTable2
            WHERE CatNum = 2
    END
    ELSE
    BEGIN
        SELECT KeyNm
            INTO #MyTempTable
            FROM dbo.MyDataTable2
            WHERE CatNum = 8
    END
    

    파서는 심지어 테이블이 이미 존재한다면 파서가 결정하는 많은 경우에, 그것은 불가능하다,이 때문에 검출을 시도해서는 안된다. 위의 코드는 파서가 @MyVariable의 값을 결정하기위한 방법이 없을 것입니다 ... 완벽한 예입니다. 나는 누군가가이 버그의 정보를 MS (나는 자신의 귀를 가지고 있지 않음)가 있기를 바랍니다.

  4. ==============================

    4.그것은 수행하여 존재하는지 확인할 수 있습니다 :

    그것은 수행하여 존재하는지 확인할 수 있습니다 :

    IF OBJECT_ID('tempdb..#columntable') IS NOT NULL
    BEGIN
    DROP TABLE #columntable
    PRINT 'Dropped table...'
    END
    
  5. ==============================

    5.글로벌 임시 테이블을 사용하여 간부의 선택을 포장.

    글로벌 임시 테이블을 사용하여 간부의 선택을 포장.

    예:

    불합격

    declare @a int = 1
    if object_id('tempdb..##temp') is not null drop table ##temp
    if(@a = 1) select * into ##temp from table_1
    else if(@a = 2) select * into ##temp from table_2
    

    승리

    declare @a int = 1
    if object_id('tempdb..##temp') is not null drop table ##temp
    if(@a = 1) exec('select * into ##temp from table_1')
    else if(@a = 2) exec('select * into ##temp from table_2')
    

    이것은 그것보다 똑똑하려고하는 버그 파서를 속일 것입니다. 그리고 마이크로 소프트는 -이 문제를 해결하시기 바랍니다.

  6. ==============================

    6.오류가 잘못의 경우 절을 제거하고 잘 통해 실행됩니다. (가) 존재에 따라서 문제는 :

    오류가 잘못의 경우 절을 제거하고 잘 통해 실행됩니다. (가) 존재에 따라서 문제는 :

    if object_id('tempdb..#columntable') is not null
    begin
        drop table #columntable
    end 
    
    create table #columntable (oldcolumns varchar(100))
    
  7. ==============================

    7.그럼 나는 대답을 얻었다 ... 마틴이 구문 분석 / 컴파일 문제입니다 말했다. 나는 아래로 내 스크립트를 변경 시도 그래서

    그럼 나는 대답을 얻었다 ... 마틴이 구문 분석 / 컴파일 문제입니다 말했다. 나는 아래로 내 스크립트를 변경 시도 그래서

      if exists (select 1  from emp where eid = 6)     
         begin
            if object_id('tempdb..#columntable') is not null 
              begin 
                 drop table #columntable                         
              end                     
            create table #columntable (oldcolumns varchar(100))   
         end
      go
     if exists (select 1  from emp where eid = 1)   
         begin
            if object_id('tempdb..#columntable') is not null 
              begin 
                 drop table #columntable            
              end         
            create table #columntable (newcolumns varchar(100))   
         end
    

    그리고 이것은 나를 위해 일했다.

  8. from https://stackoverflow.com/questions/4245444/there-is-already-an-object-named-columntable-in-the-database by cc-by-sa and MIT license