dapper : #tempDB가 생성되었지만 다음 쿼리에서 사용할 수 없음

.net c# dapper sql sql-server

문제

내 프로그램에서 다음과 같은 쿼리를 위해 tempDB 에 일부 bookID를 선택하려고합니다 (Dapper 확장 사용).

using (var conn = new SqlConnection(connStr)) {
    conn.Execute("SELECT bookID INTO #tempdb WHERE ... FROM Books");
    int count = conn.ExecuteScalar<int>("SELECT COUNT(*) FROM #tempdb");
    var authors = conn.Query("SELECT * FROM #tempdb LEFT JOIN BookAuthors ON ...");
}

그러나 페이지를 실행할 때 예외가 발생합니다.

잘못된 개체 이름 '#tempdb'.

#tempdb 수명주기는 첫 번째 쿼리에서만 유효합니까?

전문가 답변

암시 적 연결 열기 / 닫기를 사용하는 것 같습니다. 이것은 실제로 일시적인 객체에 문제를 일으킬 것입니다. 쿼리간에 임시 테이블이 필요한 경우 이러한 쿼리를 실행하기 전에 수동으로 연결을 열어야합니다. 이것은 잘 작동해야하며, 테스트 스위트의 많은 예제는 임시 테이블을 사용합니다.

그러나 실용적인 관점에서 볼 때 임시 테이블을 사용하여 쿼리간에 상태를 전송하는 것은 어색합니다. #foo 는 다른 연결 (리셋 및 재사용 된 연결 포함)에 대한 모든 사용간에 다른 의미를 가지므로 취성에 더하여 계획 캐시에는 좋지 않습니다.


인기 답변

같은 문제와 해결책을 만난 이전 포스터를 찾았습니다.

dapper를 사용하면 동일한 연결의 두 번째 사용에서 연결을 한 번 사용할 때 생성 된 임시 테이블을 사용할 수없는 이유는 무엇입니까?

이 게시물은 SQL에서 명시 적으로 "CREATE TABLE #tempdb"를 수행해야한다는 것을 나타내며 모든 것이 잘됩니다. 포스터조차도 그런 스타일의 코딩이 왜 효과가 있는지 알지 못합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow