2009-05-08 8 views
4

을 선택하십시오. 기본적으로 기존 테이블을 기반으로 임시 테이블을 만든 다음 임시 테이블에 값을 삽입하고 삽입 된 값을 선택할 수 있기를 원합니다.동적으로 임시 테이블을 만들고 임시 테이블에 삽입 한 다음

임시 테이블을 만들 수있는 부분이 있습니다. 그냥 삽입하고 양식을 선택하면 잘 작동하지 않습니다.

여기에 현재 코드가 있습니다.

(영향 44 행 (들))

(영향 1 행 (들))의 영향

(1 행 (들)

declare @table table 
(
    OrdinalPosition int, 
    ColumnName nvarchar(255), 
    DataType nvarchar(50), 
    MaxChar int, 
    Nullable nvarchar(5) 
) 
declare @i int 
declare @count int 
declare @colname nvarchar(255), @datatype nvarchar(50), @maxchar int 
declare @string nvarchar(max) 
declare @tblname nvarchar(100) 

set @tblname='Projects' 

set @string='create table #' + @tblname + ' (' 

insert into @table 
(
    OrdinalPosition, 
    ColumnName, 
    DataType, 
    MaxChar, 
    Nullable 
) 

SELECT  
    ORDINAL_POSITION , 
    COLUMN_NAME , 
    DATA_TYPE , 
    CHARACTER_MAXIMUM_LENGTH , 
    IS_NULLABLE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @tblname 

set @i=1 
select @count=count(*) from @table 

while (@i<[email protected]) 
begin 

    select @colname=ColumnName from @table where [email protected] 
    select @datatype=DataType from @table where [email protected] 
    select @maxchar=MaxChar from @table where [email protected] 

    if (@maxchar is null) 
    begin 

     set @string = @string + @colname + ' ' + @datatype 

    end 
    else 
    begin 

     set @string = @string + @colname + ' ' + @datatype + '(' + cast(@maxchar as nvarchar(20)) + ')' 

    end 

    if (@[email protected]) 
    begin 

     set @string = @string + ')' 

    end 
    else 
    begin 

     set @string = @string + ', ' 

    end 


    set @[email protected]+1 
end 

select @string 

exec(@string) 

set @string=' 
insert into #Projects (pk_prID, prWASSN_ID, prProjectStatus, prBusinessUnit, prServiceLine, prStudyTypeCode, prStudyNumber, prTimePoint, prStudyDirector, 
         prGroupLeader, prBookedDate, prBookedAmount, prConsumed, prBudgetedHours, prFinalReport, prFinalYear, prFinalMonth, prStartQA, 
         prLabWorkStarted, prLabWorkCompleted, prProjImpDate, prCompanyName, prCompanyNumber, prIsFTE, prRevisedDeadlineDate, prProjectFinalized, 
         prBookedYear, prBookedMonth, prCRMQuoteID, prLineItemNumber, prDraftReport, prInternalTargetDeadlineDate, prProtocolSignedDate, 
         prDataToRWS, prRWSWorkStarted, prFirstDraftToPL, prFirstDraftToQA, prArchivedDate, prToPLForQACommentReview, 
         prAnticipatedProjectArchiveDate, prToQAWithPLCommentResponse, prProjectReactivatedDate, prQAFinishDate, prSecondDraftReportToClient) 
select * 
from cube.Projects' 

select @string 

exec (@string) 

set @string='select * from #Projects' 

exec (@string) 

내가 얻을 에러입니다) 메시지 208, 수준 16, 상태 0, 줄 2 '#Projects'개체 이름이 잘못되었습니다. 메시지 208, 수준 16, 상태 0, 줄 1 '#Projects'개체 이름이 잘못되었습니다.

답변

7

테이블 이름을 ##로 지정하면 글로벌 임시 테이블이 생성됩니다. 범위 지정과 관련된 문제 일 수 있습니다. exec를 사용하여 테이블을 만들 수도 있지만 다시 돌아올 때 표시되지 않습니다.

+0

+1 정확히 똑같은 내용을 타이핑하는 중이었습니다. :) – Tomalak

+0

끝내주게 # 두 번째를 더하여 굉장한. – DForck42

+6

##가 전역 인 것을 기억하십시오. 프로세스 외의 다른 사람/프로세스가 액세스 할 수 있습니다. proc이 동시에 실행되거나 다른 누군가가 같은 이름의 글로벌 임시 테이블을 삭제하고 다시 작성하면 실제 문제가 발생할 수 있습니다. – HLGEM

5

exec를 호출하면 임시 테이블이 선언 된 컨텍스트 외부에서 실행된다고 생각합니다. 문자열을 함께 추가하고 exec에 대한 호출로 성공하면 성공할 것이라고 생각합니다. 또 다른 옵션은 ## 대신 접두사로 #을 사용하는 전역 임시 테이블을 사용하는 것입니다.

관련 문제