SQL Server의 임시 테이블로 인해 '이름이 지정된 개체가 이미 있습니다' 오류가 발생했습니다.
SQL Server에 다음과 같은 문제가 있습니다. 다음과 같은 코드가 있습니다.
DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))
SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN FROM TBL_PEOPLE
이 작업을 수행하면 '데이터베이스에 '#TMPGUARDIAN'이라는 개체가 이미 있습니다'라는 오류 메시지가 표시됩니다.이 오류가 발생하는 이유를 누가 알 수 있습니까?
삭제한 후 작성한 후 다음을 사용하여 다시 작성하려고 합니다.SELECT INTO
변경 내용:
DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))
INSERT INTO #TMPGUARDIAN
SELECT LAST_NAME,FRST_NAME
FROM TBL_PEOPLE
MS SQL Server에서 테이블을 생성할 수 있습니다.CREATE TABLE
사용한 설명SELECT INTO
저는 보통 저장 프로시저의 처음과 끝에 이 행들을 넣습니다.
#temp 테이블에 대한 "존재" 검사입니다.
IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
begin
drop table #MyCoolTempTable
end
전체 예:
("SELECT INTO" 문구가 부족하다는 점에 유의하십시오.
CREATE PROCEDURE [dbo].[uspTempTableSuperSafeExample]
AS
BEGIN
SET NOCOUNT ON;
IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
BEGIN
DROP TABLE #MyCoolTempTable
END
CREATE TABLE #MyCoolTempTable (
MyCoolTempTableKey INT IDENTITY(1,1),
MyValue VARCHAR(128)
)
INSERT INTO #MyCoolTempTable (MyValue)
SELECT LEFT(@@VERSION, 128)
UNION ALL SELECT TOP 3 LEFT(name, 128) FROM sysobjects
INSERT INTO #MyCoolTempTable (MyValue)
SELECT TOP 3 LEFT(name, 128) FROM sysobjects ORDER BY NEWID()
ALTER TABLE #MyCoolTempTable
ADD YetAnotherColumn VARCHAR(128) NOT NULL DEFAULT 'DefaultValueNeededForTheAlterStatement'
INSERT INTO #MyCoolTempTable (MyValue, YetAnotherColumn)
SELECT TOP 3 LEFT(name, 128) , 'AfterTheAlter' FROM sysobjects ORDER BY NEWID()
SELECT MyCoolTempTableKey, MyValue, YetAnotherColumn FROM #MyCoolTempTable
IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
BEGIN
DROP TABLE #MyCoolTempTable
END
SET NOCOUNT OFF;
END
GO
출력 ~ 샘플:
1 Microsoft-SQL-Server-BlahBlahBlah DefaultValueNeededForTheAlterStatement
2 sp_MSalreadyhavegeneration DefaultValueNeededForTheAlterStatement
3 sp_MSwritemergeperfcounter DefaultValueNeededForTheAlterStatement
4 sp_drop_trusted_assembly DefaultValueNeededForTheAlterStatement
5 sp_helplogreader_agent DefaultValueNeededForTheAlterStatement
6 fn_MSorbitmaps DefaultValueNeededForTheAlterStatement
7 sp_check_constraints_rowset DefaultValueNeededForTheAlterStatement
8 fn_varbintohexstr AfterTheAlter
9 sp_MSrepl_check_publisher AfterTheAlter
10 sp_query_store_consistency_check AfterTheAlter
또한 여기에서 제 답변을 참조하십시오("#sknowledge table의 범위는 무엇입니까"). https://stackoverflow.com/a/20105766/214977
쿼리를 다음과 같이 수정해야 합니다.
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))
INSERT INTO #TMPGUARDIAN(FRST_NAME,LAST_NAME)
SELECT LAST_NAME,FRST_NAME FROM TBL_PEOPLE
모든 임시 테이블을 지우기 위한 마지막 세션을 만듭니다.항상 끝에 떨어집니다.이 경우 삭제를 시도하는 동안 테이블이 없는 경우 오류가 발생할 수 있습니다.
DROP TABLE #TMPGUARDIAN
삽입을 사용하지 마십시오. 나중에 삽입을 사용하는 경우 삽입과 함께가 아니라 일부 프로세스 후에 채울 수 있는 새 열을 추가하여 임시 테이블을 수정하려면 삽입을 사용하지 마십시오.그 때, 당신은 동일한 방식으로 재작업하고 설계해야 합니다.
테이블 변수 사용 http://odetocode.com/articles/365.aspx
declare @userData TABLE(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30)
)
장점 Drop 문은 변수와 유사하므로 필요하지 않습니다.실행 직후에 범위가 종료됩니다.
때때로 동일한 .sql 파일(같은 작업 공간/탭)에 삽입 쿼리를 쓰는 것과 같은 어리석은 실수를 할 수 있으므로, 작성 쿼리가 바로 위에 쓰여지고 이미 실행된 삽입 쿼리를 실행하면 다시 삽입 쿼리와 함께 실행이 시작됩니다.
두 번째로 실행되기 때문에 객체 이름(테이블 이름)이 이미 존재하는 이유입니다.
따라서 별도의 탭으로 이동하여 삽입, 삭제 또는 실행하려는 쿼리를 작성합니다.
또는 다음과 같이 동일한 작업 공간에서 모든 쿼리 앞에 설명 행을 사용합니다.
CREATE -- …
-- Insert query
INSERT INTO -- …
다음과 같은 문제가 있었습니다.
DROP TABLE IF EXISTS #MyTempTable
CREATE TABLE #MyTempTable (
MyTempTableID INT,
OtherColID INT
);
하지만 저는 GO로 문장을 구분해서 풀 수 있었습니다.
DROP TABLE IF EXISTS #MyTempTable
GO
CREATE TABLE #MyTempTable (
MyTempTableID INT,
OtherColID INT
);
Azure Data 웨어하우스에서도 사용자 세션을 위해 임시 테이블이 생성되었기 때문에 이러한 현상이 가끔 발생합니다.데이터베이스를 다시 연결하여 동일한 문제를 해결했습니다.
언급URL : https://stackoverflow.com/questions/18321245/temporary-table-in-sql-server-causing-there-is-already-an-object-named-error
'programing' 카테고리의 다른 글
jQuery AJAX를 사용한 PHP의 여러 반환 값 (0) | 2023.07.29 |
---|---|
Float - FCM 온백그라운드 메시지 핸들러가 등록되지 않아 Dart에서 백그라운드 메시지를 처리할 수 없습니다. (0) | 2023.07.09 |
인라인 변수가 있는 다중 줄 파이썬 문자열을 만들려면 어떻게 해야 합니까? (0) | 2023.07.09 |
Python/SciPy를 위한 피크 찾기 알고리즘 (0) | 2023.07.09 |
결과 세트를 닫은 후 Oracle이 커서를 제거하지 않음 (0) | 2023.07.09 |