복붙노트

[SQL] #table에 ... 선택에 대한 sp_executesql을 실행하지만, 임시 테이블 데이터를 선택할 수 없다

SQL

#table에 ... 선택에 대한 sp_executesql을 실행하지만, 임시 테이블 데이터를 선택할 수 없다

선택 ... 임시 sp_Executedsql 표 #TempTable에 노력했다. 아니 그 성공적으로 삽입 여부를하지만,이 메시지는이 기록 성공적인 평균이 삽입 된 것을 (359 행 (들)에 영향)? 아래 스크립트

DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable 
            from SPCTable with(nolock)
            where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To';

SET @Sql = 'DECLARE @Date_From VARCHAR(10);
            DECLARE @Date_To VARCHAR(10);
            SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
            SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
            '+ @Sql;

EXECUTE sp_executesql @Sql;

실행 후, 메시지에 대한 그것의 반환 날 (359 행 (들)에 영향). 다음 #TempTable에서 데이터를 선택하려고 할 때.

Select * From #TempTable;

그것의 반환 나 :

Msg 208, Level 16, State 0, Line 2
Invalid object name '#TempTable'.

단지 그 작업에만 '선택'섹션을 의심. 삽입이 작동하지 않습니다. 해결 방법을?

해결법

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

    1.지역 임시 테이블 예 : #table_name 만 전역 임시 ## TABLE_NAME 테이블은 모든 세션에서 볼 수 있습니다 현재 세션에서 볼 수 있습니다. 자신의 세션이 닫힐 때까지 모두 살고있다. sp_executesql에 - 자신의 세션 (아마도 단어 "범위"더 나은 것)를 작성 그래서 그런 일이 왜의.

    지역 임시 테이블 예 : #table_name 만 전역 임시 ## TABLE_NAME 테이블은 모든 세션에서 볼 수 있습니다 현재 세션에서 볼 수 있습니다. 자신의 세션이 닫힐 때까지 모두 살고있다. sp_executesql에 - 자신의 세션 (아마도 단어 "범위"더 나은 것)를 작성 그래서 그런 일이 왜의.

  2. ==============================

    2.이 시나리오에서 전역 임시 테이블을 사용하면 테이블 세션 사이에 존재하는 것이며, 비동기 적으로 호출하는 코드를 사용하여 몇 가지 문제가 발생할 수 있으므로 문제가 발생할 수 있습니다.

    이 시나리오에서 전역 임시 테이블을 사용하면 테이블 세션 사이에 존재하는 것이며, 비동기 적으로 호출하는 코드를 사용하여 몇 가지 문제가 발생할 수 있으므로 문제가 발생할 수 있습니다.

    이 sp_executesql을 예를 들어, 호출하기 전에 정의 된 경우 로컬 임시 테이블을 사용할 수 있습니다

    CREATE TABLE #tempTable(id int);
    
    sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable';
    
    SELECT * FROM #tempTable;
    
  3. ==============================

    3.당신의 @Sql 문자열에서 #TempTable에 삽입하지 않습니다. 대신, INSERT 문없이 SELECT 문을 호출합니다.

    당신의 @Sql 문자열에서 #TempTable에 삽입하지 않습니다. 대신, INSERT 문없이 SELECT 문을 호출합니다.

    마지막으로, 지금과 같은 임시 테이블에 결과를 삽입 :

    INSERT INTO @tmpTbl EXEC sp_executesql @sql
    

    또한,이 방법을 사용하는 경우 임시 테이블을 선언해야합니다

    DECLARE @tmpTbl TABLE (
        //define columns here...
    )
    
  4. ==============================

    4.동적 SQL에서 임시 테이블은 비 동적 SQL 부분의 범위를 벗어났습니다.

    동적 SQL에서 임시 테이블은 비 동적 SQL 부분의 범위를 벗어났습니다.

    이 처리하는 방법을 여기 봐 : A는 SQL 서버 로컬 임시 테이블에 대한 비트

  5. ==============================

    5.임시 테이블은이를 작성하는 연결만큼 살고 있습니다. 난 당신이 실수로 별도의 연결에 선택을 발행하고 있다는 기대. 당신은 일시적이 아닌 임시 테이블로 삽입을하고 데이터가있을 경우보고하여이를 테스트 할 수 있습니다. 이런 경우 당신은 원래의 솔루션으로 돌아가 당신의 선택에 연결 개체를 통과 확신 할 수 있습니다.

    임시 테이블은이를 작성하는 연결만큼 살고 있습니다. 난 당신이 실수로 별도의 연결에 선택을 발행하고 있다는 기대. 당신은 일시적이 아닌 임시 테이블로 삽입을하고 데이터가있을 경우보고하여이를 테스트 할 수 있습니다. 이런 경우 당신은 원래의 솔루션으로 돌아가 당신의 선택에 연결 개체를 통과 확신 할 수 있습니다.

  6. ==============================

    6.

    declare @sql varchar(1000)
    set @sql="select * into #t from table;"
    set @sql =@sql + "select * from #t;"
    
     execute  SP_EXECUTESQL  @sql
    
  7. ==============================

    7.이것은 나를 위해 일한

    이것은 나를 위해 일한

    declare @sql nvarchar(max)     
    create table #temp ( listId int, Name nvarchar(200))     
    set @sql = 'SELECT top 10 ListId, Name FROM [V12-ListSelector].[dbo].[List]'    
    insert into #temp
    exec sp_executesql  @sql    
    select * from #temp    
    drop table #temp
    
  8. ==============================

    8.이 문제를 이용 해결하려면 a는 sp_executesql을 실행하기 전에 빈 임시 테이블을 생성하는 첫 번째 테이블 #TEMPTABLE 명령을 만듭니다. 그런 다음 sp_executesql을 사용하여 INSERT INTO #TEMPTABLE를 실행합니다. 이 작동합니다. 이것은 내가 내 모든 쿼리는 일반적으로 sp_executesql을 통해 실행되는 설정을 가지고 나는이 문제를 극복하는 방법입니다.

    이 문제를 이용 해결하려면 a는 sp_executesql을 실행하기 전에 빈 임시 테이블을 생성하는 첫 번째 테이블 #TEMPTABLE 명령을 만듭니다. 그런 다음 sp_executesql을 사용하여 INSERT INTO #TEMPTABLE를 실행합니다. 이 작동합니다. 이것은 내가 내 모든 쿼리는 일반적으로 sp_executesql을 통해 실행되는 설정을 가지고 나는이 문제를 극복하는 방법입니다.

  9. from https://stackoverflow.com/questions/8040105/execute-sp-executesql-for-select-into-table-but-cant-select-out-temp-table-d by cc-by-sa and MIT license