복붙노트

[SQL] TSQL 동적 SQL에서 임시 테이블로 선택

SQL

TSQL 동적 SQL에서 임시 테이블로 선택

이것은 비교적 간단 보인다,하지만 분명히 그렇지 않다.

나는 구문으로 선택을 통해 기존의 테이블을 기반으로 임시 테이블을 작성해야합니다 :

SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE

문제는 기존의 테이블 이름은 매개 변수를 통해 접수입니다 ...

나는 테이블의 데이터를 통해 얻을 수 있습니다 :

execute ('SELECT * FROM ' + @tableName)

하지만 두 그래서 결혼을 어떻게 내가 임시 테이블에 실행에서 직접 결과를 넣을 수있다.

이으로 사용하는 것을 각 테이블의 열은 데이터를 가져 오는 것은 실용적이지되기 전에 임시 테이블을 구축 같은 그렇게하지 않습니다.

나는 전역 임시 테이블을 사용하여 제외한 모든 제안에 개방적이야.

최신 정보:

이것은 완전히 말도 있지만, 글로벌 임시 테이블 내 예약이 테이블이 오랜 시간 동안 남아 않을 경우 다중 사용자 플랫폼은 문제라는 것으로 점이다 ...

SOOO .. 그냥은 글로벌 임시 테이블을 생성하는 실행 사용하여 시작했습니다이 부분을지나 얻을 수 있습니다.

execute('select * into ##globalDynamicFormTable from ' + @tsFormTable) 

나는 다음 로컬 임시 테이블을로드 할 글로벌 임시 테이블을 사용합니다 :

select * into #tempTable from ##globalDynamicFormTable

나는 다음 글로벌 테이블을 삭제.

drop table ##globalDynamicFormTable

이 더러운이며 나는 그것을 좋아하지 않아,하지만 난 더 나은 솔루션을 얻을 때까지 당분간, 그 일을해야 할 것.

결국 :

나는 그것을 극복 할 수있는 방법이없는 것 같아요.

가장 좋은 대답이 될 것으로 보인다;

명령 실행의 뷰를 작성하고 저장 프로 시저에서 지역 임시 테이블을로드하는 것을 사용한다.

명령 실행의 글로벌 임시 테이블을 만들고 로컬 임시 테이블을로드하는 것을 사용한다.

그 생성 및 내 조직에 감사한다 전망을 떨어 뜨리고 있기 때문에 내가 아마 글로벌 임시 테이블을 고수 것이고, 나는 확실히 그들이 그것을 시작하면 모든 시간을 일이 그 질문에가는거야 말한다면.

감사!

해결법

  1. ==============================

    1.동작하는 예제.

    동작하는 예제.

    DECLARE @TableName AS VARCHAR(100)
    SELECT @TableName = 'YourTableName'
    
    EXECUTE ('SELECT * INTO #TEMP  FROM ' + @TableName +'; SELECT * FROM #TEMP;')
    

    접근 임시 테이블에 두 번째 솔루션

    DECLARE @TableName AS VARCHAR(100)
    SELECT @TableName = 'YOUR_TABLE_NAME'
    
    EXECUTE ('CREATE VIEW vTemp AS
            SELECT *
            FROM ' + @TableName)
    SELECT * INTO #TEMP  FROM vTemp 
    
    --DROP THE VIEW HERE      
    DROP VIEW vTemp
    
    /*START USING TEMP TABLE
    ************************/
    --EX:
    SELECT * FROM #TEMP
    
    
    --DROP YOUR TEMP TABLE HERE
    DROP TABLE #TEMP
    
  2. ==============================

    2.

    declare @sql varchar(100);
    
    declare @tablename as varchar(100);
    
    select @tablename = 'your_table_name';
    
    create table #tmp 
        (col1 int, col2 int, col3 int);
    
    set @sql = 'select aa, bb, cc from ' + @tablename;
    
    insert into #tmp(col1, col2, col3) exec( @sql );
    
    select * from #tmp;
    
  3. ==============================

    3.내가 동적 SQL에 피벗으로 그것을 어떻게 (#AccPurch이 이전에 생성 된)

    내가 동적 SQL에 피벗으로 그것을 어떻게 (#AccPurch이 이전에 생성 된)

    DECLARE @sql AS nvarchar(MAX)
    declare @Month Nvarchar(1000)
    
    --DROP TABLE #temp
    select distinct YYYYMM into #temp from #AccPurch AS ap
    SELECT  @Month = COALESCE(@Month, '') + '[' + CAST(YYYYMM AS VarChar(8)) + '],' FROM    #temp
    
    SELECT   @Month= LEFT(@Month,len(@Month)-1)
    
    
    SET @sql = N'SELECT UserID, '+ @Month + N' into ##final_Donovan_12345 FROM (
    Select ap.AccPurch ,
           ap.YYYYMM ,
           ap.UserID ,
           ap.AccountNumber
    FROM #AccPurch AS ap 
    ) p
    Pivot (SUM(AccPurch) FOR YYYYMM IN ('+@Month+ N')) as pvt'
    
    
    EXEC sp_executesql @sql
    
    Select * INTO #final From ##final_Donovan_12345
    
    DROP TABLE  ##final_Donovan_12345
    
    Select * From #final AS f
    
  4. ==============================

    4.OPENROWSET에서 살펴보고 같은 것을 할 :

    OPENROWSET에서 살펴보고 같은 것을 할 :

    SELECT * INTO #TEMPTABLE FROM OPENROWSET('SQLNCLI'
         , 'Server=(local)\SQL2008;Trusted_Connection=yes;',
         'SELECT * FROM ' + @tableName)
    
  5. from https://stackoverflow.com/questions/9534990/tsql-select-into-temp-table-from-dynamic-sql by cc-by-sa and MIT license