임시 테이블이 있는지 확인하고 임시 테이블을 만들기 전에 해당 테이블이 있으면 삭제하십시오.
다음 코드를 사용하여 임시 테이블이 존재하는지 확인하고 해당 테이블이 존재하는지 여부를 드롭한 후 다시 만듭니다.열을 바꾸지 않으면 잘 작동합니다.나중에 열을 추가하면 "invalid column"이라는 오류가 나타납니다.제가 뭘 잘못하고 있는지 알려주세요.
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
문장은 순서대로 작성해야 합니다.
- 테이블에 대한 문 변경
- 가세요
- 스테이트먼트를선택해주세요.
중간에 'GO'가 없으면 모든 것이 하나의 스크립트로 간주되며 선택문이 열을 검색해도 찾을 수 없습니다.
'GO'를 사용하면 스크립트의 'GO'까지의 부분을 1개의 배치로 간주하여 '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 [IF EXISTES ][ database _ name . [ schema _ name ].| schema _ name . ]테이블_name [ , ... n ]
쿼리:
DROP TABLE IF EXISTS #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
이것은, 1 행의 코드로 실행할 수 있습니다.
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=required은 도움이 되었습니다.
if exists (
select * from tempdb.dbo.sysobjects o
where o.xtype in ('U')
and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;
SQL Server의 새 버전(2016+) 중 하나를 사용하는 경우 다음 구문을 사용할 수 있습니다.
DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)
그 이후로 제 쪽에서 한마디만 해드릴게요OBJECT_ID
나한테는 안 통한다.항상 돌아온다
'#tempTable은 존재하지 않습니다.
그게 존재하긴 하지만요다른 이름으로 저장되어 있는 것을 발견했습니다(고정자)_
밑줄)은 다음과 같습니다.
#tempTable________
이 방법은 나에게 효과적이다.
IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
DROP TABLE #tempTable;
END;
이건 나한테 효과가 있었어
IF OBJECT_ID('tempdb.dbo.#tempTable') IS NOT NULL
DROP TABLE #tempTable;
여기서는 tempdb.dbo(dbo는 스키마일 뿐)가 더 중요합니다.
pmac72는 GO를 사용하여 쿼리를 배치로 분할하고 ALTER를 사용하고 있습니다.
같은 배지를 실행하고 있는 것처럼 보이지만 변경 후 두 번 실행하고 있습니다.DROP...작성...편집...드롭...작성...
무슨 일이 일어나고 있는지 알 수 있도록 정확한 코드를 올려주세요.
이 오류는 보통 임시 테이블을 이미 작성했을 때 발생합니다. SQL 문에 오류가 없는지 확인하는 코드는 "오래된" 임시 테이블을 확인하고 임시 테이블이 삭제되지 않은 것처럼 이후의 문에 있는 열 수에 대한 잘못된 카운트를 반환합니다.
열이 적은 버전을 이미 만든 후 임시 테이블의 열 수를 변경한 후 테이블을 삭제한 다음 쿼리를 실행합니다.
최근에 DBA가 다음과 같은 작업을 수행하는 것을 보았습니다.
begin try
drop table #temp
end try
begin catch
print 'table does not exist'
end catch
create table #temp(a int, b int)
주의: 이것은 ## temp 테이블에도 적용됩니다.
예.
IF OBJECT_ID('tempdb.dbo.##AuditLogTempTable1', 'U') IS NOT NULL
DROP TABLE ##AuditLogTempTable1
참고: 이 유형의 명령어는 SQL Server 2016 이후에만 적합합니다.자신에게 물어보세요.아직 SQL Server 2012를 사용하고 있는 고객이 있습니까?
DROP TABLE IF EXISTS ##AuditLogTempTable1
에는 코코 a가 되고 있다.Source
과 '''가 있습니다.Destination
이러한 변경과 일치해야 하는 테이블입니다.
--
-- Sample SQL to update only rows in a "Destination" Table
-- based on only rows that have changed in a "Source" table
--
--
-- Drop and Create a Temp Table to use as the "Source" Table
--
IF OBJECT_ID('tempdb..#tSource') IS NOT NULL drop table #tSource
create table #tSource (Col1 int, Col2 int, Col3 int, Col4 int)
--
-- Insert some values into the source
--
Insert #tSource (Col1, Col2, Col3, Col4) Values(1,1,1,1)
Insert #tSource (Col1, Col2, Col3, Col4) Values(2,1,1,2)
Insert #tSource (Col1, Col2, Col3, Col4) Values(3,1,1,3)
Insert #tSource (Col1, Col2, Col3, Col4) Values(4,1,1,4)
Insert #tSource (Col1, Col2, Col3, Col4) Values(5,1,1,5)
Insert #tSource (Col1, Col2, Col3, Col4) Values(6,1,1,6)
--
-- Drop and Create a Temp Table to use as the "Destination" Table
--
IF OBJECT_ID('tempdb..#tDest') IS NOT NULL drop Table #tDest
create table #tDest (Col1 int, Col2 int, Col3 int, Col4 int)
--
-- Add all Rows from the Source to the Destination
--
Insert #tDest
Select Col1, Col2, Col3, Col4 from #tSource
--
-- Look at both tables to see that they are the same
--
select *
from #tSource
Select *
from #tDest
--
-- Make some changes to the Source
--
update #tSource
Set Col3=19
Where Col1=1
update #tSource
Set Col3=29
Where Col1=2
update #tSource
Set Col2=38
Where Col1=3
update #tSource
Set Col2=48
Where Col1=4
--
-- Look at the Differences
-- Note: Only 4 rows are different. 2 Rows have remained the same.
--
Select Col1, Col2, Col3, Col4
from #tSource
except
Select Col1, Col2, Col3, Col4
from #tDest
--
-- Update only the rows that have changed
-- Note: I am using Col1 like an ID column
--
Update #tDest
Set Col2=S.Col2,
Col3=S.Col3,
Col4=S.Col4
From ( Select Col1, Col2, Col3, Col4
from #tSource
except
Select Col1, Col2, Col3, Col4
from #tDest
) S
Where #tDest.Col1=S.Col1
--
-- Look at the tables again to see that
-- the destination table has changed to match
-- the source table.
select *
from #tSource
Select *
from #tDest
--
-- Clean Up
--
drop table #tSource
drop table #tDest
네, 이 오류는 "select company, stepid, fieldid, New Column from #Results" 행에서 발생합니다.
t-sql 실행에는 2가지 단계가 있습니다.
먼저 구문 분석, 이 단계에서는 sql 서버가 테이블의 컬럼을 포함하여 사용자가 제출한 sql 문자열의 수정을 체크하고 쿼리를 가장 빠른 검색으로 최적화합니다.
둘째, 실행, 데이터 취득.
테이블 #Results가 존재하는 경우 해석 프로세스는 지정한 열이 유효한지 여부를 확인합니다.그렇지 않은 경우(테이블이 존재하지 않음) 해석은 지정한 대로 검사 열을 통과시킵니다.
임시 테이블의 열을 변경할 경우 쿼리를 다시 실행하기 전에 테이블을 삭제해야 합니다.(네, 귀찮습니다.당신이 해야 할 일입니다.)
이것은 항상 쿼리가 실행되기 전에 파서에 의해 "비활성 컬럼" 체크가 이루어지기 때문에 테이블 내의 컬럼을 기반으로 하기 때문에 pnbs도 그렇게 말했습니다.
언급URL : https://stackoverflow.com/questions/659051/check-if-a-temporary-table-exists-and-delete-if-it-exists-before-creating-a-temp
'programing' 카테고리의 다른 글
현재 트랜잭션 수준을 찾는 방법 (0) | 2023.04.07 |
---|---|
저장 프로시저에서 선택하는 방법 (0) | 2023.04.07 |
LIKE 절에서 대괄호를 이스케이프하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
SQL Server에서의 INSERT 또는 업데이트 솔루션 (0) | 2023.04.07 |
.bak 파일을 SQL 서버의 데이터베이스로 가져옵니다. (0) | 2023.04.07 |