[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.임시 테이블 쿼리의 끝에서 자동으로 삭제되지는 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.이것은 불행하게도 (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.당신이 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.그것은 수행하여 존재하는지 확인할 수 있습니다 :
그것은 수행하여 존재하는지 확인할 수 있습니다 :
IF OBJECT_ID('tempdb..#columntable') IS NOT NULL BEGIN DROP TABLE #columntable PRINT 'Dropped table...' END
-
==============================
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.오류가 잘못의 경우 절을 제거하고 잘 통해 실행됩니다. (가) 존재에 따라서 문제는 :
오류가 잘못의 경우 절을 제거하고 잘 통해 실행됩니다. (가) 존재에 따라서 문제는 :
if object_id('tempdb..#columntable') is not null begin drop table #columntable end create table #columntable (oldcolumns varchar(100))
-
==============================
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
그리고 이것은 나를 위해 일했다.
from https://stackoverflow.com/questions/4245444/there-is-already-an-object-named-columntable-in-the-database by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 T-SQL을 사용하여 텍스트 파일을 읽을 수? (0) | 2020.07.13 |
---|---|
[SQL] - MySQL의의 복잡성 : MyTable에 FROM SELECT COUNT (*); (0) | 2020.07.13 |
[SQL] WHERE 문에 대해 LIKE 및 IN을 사용하는 것이 가능? (0) | 2020.07.13 |
[SQL] MSExcel 및 SQL 서버에서 날짜 변환의 차이 (0) | 2020.07.13 |
[SQL] 캔 INSERT는 [...] ON 충돌이 외래 키 위반에 사용? (0) | 2020.07.13 |