복붙노트

[SQL] SQL Server의 임시 테이블의 범위

SQL

SQL Server의 임시 테이블의 범위

나는 가져오고 다른 하나의 데이터베이스에서 데이터를 변환 저장 프로 시저를 썼다. 각 가져 오기 단일 회사 ID를 가지고이 회사와 관련된 모든 데이터를 가져올 것입니다.

변환 단계에 도움이 나는 임시 테이블을 사용합니다. 스크립트 검토의 일환으로, 나는 테이블 변수보다는 임시 테이블을 사용하는 들었다. 우리는 동시에 두 개의 서로 다른 수입을 실행하면 검토 주장은 임시 테이블을 공유하고 가져 오기 손상 될 수있다.

질문 :

여기에 스크립트의 인위적인 예입니다.

CREATE PROC [dbo].[ImportCompany]
(
    @CompanyId AS INTEGER
)
AS
EXEC [dbo].[ImportAddress] @CompanyId = @CompanyId 
--Import other data

CREATE PROC [dbo].[ImportAddress]
(
    @CompanyId AS INTEGER
)
AS
    CREATE TABLE #Companies (OldAddress NVARCHAR(128), NewAddress NVARCHAR(128))
    INSERT INTO #Companies(OldAddress, NewAddress)
    SELECT
        Address as OldAddress,
        'Transformed ' + Address as NewAddress
    FROM
        [OldDb].[dbo].[Addresses]
    WHERE
        CompanyId = @CompanyId

    --Do stuff with the transformed data

    DROP TABLE #Companies

EXEC [dbo].[ImportCompany] @CompanyId = 12345

해결법

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

    1.에서하는 테이블을 만듭니다

    에서하는 테이블을 만듭니다

    그리고 (더 중요한) :

    어떤 정확히 공유 할 것이라고 말했다 누구의 지점을 rebuts.

    또한, 프로 시저의 끝에서 DROP 테이블에 필요 (같은 링크에서 다시)이 없습니다 :

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

    2.## 글로벌 임시 테이블에 사용되는 - 다른 수입에 사용할 수 있습니다.

    ## 글로벌 임시 테이블에 사용되는 - 다른 수입에 사용할 수 있습니다.

    # 로컬 임시 테이블에 사용하고 현재 / 내부 범위에서만 사용할 수 있습니다.

  3. ==============================

    3.한 세션은 다른 세션의 임시 테이블을 볼 수 없습니다. 그래서 다른 수입에 관계없이 임시 테이블이나 테이블 변수 사용 여부, 서로 영향을 미치지 않습니다.

    한 세션은 다른 세션의 임시 테이블을 볼 수 없습니다. 그래서 다른 수입에 관계없이 임시 테이블이나 테이블 변수 사용 여부, 서로 영향을 미치지 않습니다.

    예외는 ##로 시작 전역 임시 테이블입니다. 사람들은 모든 연결을 볼 수 있습니다.

  4. ==============================

    4.난 그냥 트리거에서 사용되는 임시 테이블이 이상하게 행동 이유를 찾기 위해 애 쓰고 몇 시간을 보냈다. 그럼 내가 저장 프로 시저에서 임시 테이블은 트리거를 발생시킨 데이터를 삽입하기 위해 사용되는 임시 테이블이 같은 이름을 가지고 것을 깨달았다. 나는 이것이 바로 나에게 명백해야한다는 지금은 알고 있지만 이해가되지 않는 이유 뭔가를 찾으려고 할 때 가장 확실한 원인을 내려다의 전형적인 사건이었다.

    난 그냥 트리거에서 사용되는 임시 테이블이 이상하게 행동 이유를 찾기 위해 애 쓰고 몇 시간을 보냈다. 그럼 내가 저장 프로 시저에서 임시 테이블은 트리거를 발생시킨 데이터를 삽입하기 위해 사용되는 임시 테이블이 같은 이름을 가지고 것을 깨달았다. 나는 이것이 바로 나에게 명백해야한다는 지금은 알고 있지만 이해가되지 않는 이유 뭔가를 찾으려고 할 때 가장 확실한 원인을 내려다의 전형적인 사건이었다.

    그래서이 저장된 프로 시저가 다른 저장된 프로 시저를 호출하거나 트리거를 발생하는 경우, 다음 임시 테이블 이름은 원치 않는 부작용을 방지하기 위해 다음에서 고유해야한다는 것을 기억하는 것이 중요하다.

    더욱이 - 예상에도 내측 저장된 프로 시저에 다음 코드를 실행할 때 작동하지 않을 것이다. 외부 저장된 프로 시저가 임시 테이블 이름을 잠글 것입니다.

    IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
        DROP TABLE #TempTable
    
  5. from https://stackoverflow.com/questions/18614344/scope-of-temporary-tables-in-sql-server by cc-by-sa and MIT license