2016-06-01 1 views
1

선언 된 변수에 따라 여러 서버 중 하나의 데이터로 임시 테이블을 채우는 데 동적 SQL을 사용하려고합니다. 원본 데이터에는 미래에 더 많은 열이 추가 될 수 있으므로 명시 적으로 정의 할 필요없이 현재 존재하는 열을 기반으로 대상 임시 테이블을 만들 수 있어야합니다.select into를 사용하여 즉시 테이블 만들기

Select top 1 * into #tempTable from MyTable 
Delete from #tempTable 

또는 : 나는 사용하여 적절한 열이 빈 테이블을 만들려고

Select * into #tempTable from MyTable where 1 = 0 

모두 빈 테이블을 작성했다,하지만 난 다음에 삽입하려고 할 때 :

01 :

declare @sql varchar(max) = 'Select * from ' 
+ case when @server = '1' then 'Server1.' else 'Server2.' end 
+ 'database.dbo.MyTable' 

Insert into #tempTable 
    exec(@sql) 

나는이 오류

Msg 213, Level 16, State 7, Line 1 Column name or number of supplied values does not match table definition.

exec(@sql)은 단독으로 작동합니다. 두 단계 모두 동일한 서버에서 동일한 테이블을 사용하는 경우에도이 오류가 발생합니다. 수정이 가능합니까? 아니면 create table으로 테이블을 명시 적으로 정의해야합니까? 선수 컬럼 임시 테이블의 열 ID(Int, Identity) 장착

+0

는 당신이 연결하는 사용자가있는 테이블 "myTable에"를 가지고 있는가 년대 서버 1 또는 서버 2에 비해 구조적으로 다른 스키마? – xQbert

+0

아니요. 'select into'와 'into into'둘 모두에서 동일한 서버 및 테이블을 사용하여이 작업을 시도했으며 비교할 #tempTable 및 MyTable에서 선택했습니다. 그들은 동일하게 보입니다. – APH

+1

삽입과 임용을 결합 할 수 없다고 생각했습니다. 그것들은 모두 동적 인 SQL이거나 전혀 존재하지 않아야합니다. 'exec ('#tempTable'+ @sql) '에 삽입하십시오. – xQbert

답변

1

전역 임시 테이블 사용 방법은 어떻습니까? 여러 사용자 및 데이터베이스에서 액세스 할 수 있으므로 전역 임시 테이블을 사용하면 몇 가지 단점이 있습니다. 심판 http://sqlmag.com/t-sql/temporary-tables-local-vs-global

DECLARE @sql nvarchar(max) = 'SELECT * INTO ##tempTable FROM ' 
+ case when @server = '1' THEN 'Server1.' ELSE 'Server2.' END 
+ 'database.dbo.MyTable' 

EXECUTE sp_executesql (@sql) 

SELECT * FROM ##tempTable 
+0

감사! 필자는 전역 temp 테이블이 동적 SQL에서 이와 같이 작동한다는 것을 깨닫지 못했습니다. – APH

1

(유용한 주석 @XQbert 덕분) 단지 int 의도로서 기능

Insert into #tempTable 
    exec(@sql) 

시킨다.

그 구문과

declare @sql varchar(max) = 'Insert into #tempTable Select * from ' 
+ case when @server = '1' then 'Server1.' else 'Server2.' end 
+ 'database.dbo.MyTable' 

exec(@sql) 

모두 작동하지만, 동적 SQL의 insert 부분을 만드는 것은 문제 해결에 훨씬 더 도움이 오류 메시지를 생성했다.

관련 문제