[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.지역 임시 테이블 예 : #table_name 만 전역 임시 ## TABLE_NAME 테이블은 모든 세션에서 볼 수 있습니다 현재 세션에서 볼 수 있습니다. 자신의 세션이 닫힐 때까지 모두 살고있다. sp_executesql에 - 자신의 세션 (아마도 단어 "범위"더 나은 것)를 작성 그래서 그런 일이 왜의.
지역 임시 테이블 예 : #table_name 만 전역 임시 ## TABLE_NAME 테이블은 모든 세션에서 볼 수 있습니다 현재 세션에서 볼 수 있습니다. 자신의 세션이 닫힐 때까지 모두 살고있다. sp_executesql에 - 자신의 세션 (아마도 단어 "범위"더 나은 것)를 작성 그래서 그런 일이 왜의.
-
==============================
2.이 시나리오에서 전역 임시 테이블을 사용하면 테이블 세션 사이에 존재하는 것이며, 비동기 적으로 호출하는 코드를 사용하여 몇 가지 문제가 발생할 수 있으므로 문제가 발생할 수 있습니다.
이 시나리오에서 전역 임시 테이블을 사용하면 테이블 세션 사이에 존재하는 것이며, 비동기 적으로 호출하는 코드를 사용하여 몇 가지 문제가 발생할 수 있으므로 문제가 발생할 수 있습니다.
이 sp_executesql을 예를 들어, 호출하기 전에 정의 된 경우 로컬 임시 테이블을 사용할 수 있습니다
CREATE TABLE #tempTable(id int); sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable'; SELECT * FROM #tempTable;
-
==============================
3.당신의 @Sql 문자열에서 #TempTable에 삽입하지 않습니다. 대신, INSERT 문없이 SELECT 문을 호출합니다.
당신의 @Sql 문자열에서 #TempTable에 삽입하지 않습니다. 대신, INSERT 문없이 SELECT 문을 호출합니다.
마지막으로, 지금과 같은 임시 테이블에 결과를 삽입 :
INSERT INTO @tmpTbl EXEC sp_executesql @sql
또한,이 방법을 사용하는 경우 임시 테이블을 선언해야합니다
DECLARE @tmpTbl TABLE ( //define columns here... )
-
==============================
4.동적 SQL에서 임시 테이블은 비 동적 SQL 부분의 범위를 벗어났습니다.
동적 SQL에서 임시 테이블은 비 동적 SQL 부분의 범위를 벗어났습니다.
이 처리하는 방법을 여기 봐 : A는 SQL 서버 로컬 임시 테이블에 대한 비트
-
==============================
5.임시 테이블은이를 작성하는 연결만큼 살고 있습니다. 난 당신이 실수로 별도의 연결에 선택을 발행하고 있다는 기대. 당신은 일시적이 아닌 임시 테이블로 삽입을하고 데이터가있을 경우보고하여이를 테스트 할 수 있습니다. 이런 경우 당신은 원래의 솔루션으로 돌아가 당신의 선택에 연결 개체를 통과 확신 할 수 있습니다.
임시 테이블은이를 작성하는 연결만큼 살고 있습니다. 난 당신이 실수로 별도의 연결에 선택을 발행하고 있다는 기대. 당신은 일시적이 아닌 임시 테이블로 삽입을하고 데이터가있을 경우보고하여이를 테스트 할 수 있습니다. 이런 경우 당신은 원래의 솔루션으로 돌아가 당신의 선택에 연결 개체를 통과 확신 할 수 있습니다.
-
==============================
6.
declare @sql varchar(1000) set @sql="select * into #t from table;" set @sql =@sql + "select * from #t;" execute SP_EXECUTESQL @sql
-
==============================
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.이 문제를 이용 해결하려면 a는 sp_executesql을 실행하기 전에 빈 임시 테이블을 생성하는 첫 번째 테이블 #TEMPTABLE 명령을 만듭니다. 그런 다음 sp_executesql을 사용하여 INSERT INTO #TEMPTABLE를 실행합니다. 이 작동합니다. 이것은 내가 내 모든 쿼리는 일반적으로 sp_executesql을 통해 실행되는 설정을 가지고 나는이 문제를 극복하는 방법입니다.
이 문제를 이용 해결하려면 a는 sp_executesql을 실행하기 전에 빈 임시 테이블을 생성하는 첫 번째 테이블 #TEMPTABLE 명령을 만듭니다. 그런 다음 sp_executesql을 사용하여 INSERT INTO #TEMPTABLE를 실행합니다. 이 작동합니다. 이것은 내가 내 모든 쿼리는 일반적으로 sp_executesql을 통해 실행되는 설정을 가지고 나는이 문제를 극복하는 방법입니다.
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
'SQL' 카테고리의 다른 글
[SQL] ''근처의 구문이 잘못되었습니다 (0) | 2020.06.12 |
---|---|
[SQL] SQL 서버 : 쿼리와 컬럼의 디폴트 값을 찾기 (0) | 2020.06.12 |
[SQL] 선택 쿼리 내부에 저장 프로 시저를 실행하는 방법 (0) | 2020.06.12 |
[SQL] @ 기호 - MySQL의에서 재귀 SELECT 질의에 대한 해결책? (0) | 2020.06.12 |
[SQL] 설정 제한 SQL에서 테이블 행에 대한 (0) | 2020.06.12 |