2013-09-04 73 views
30

Tôi đã viết một thủ tục được lưu trữ để nhập và chuyển đổi dữ liệu từ cơ sở dữ liệu này sang cơ sở dữ liệu khác. Mỗi lần nhập sẽ lấy một ID công ty và nhập tất cả dữ liệu liên quan đến công ty này.Phạm vi của các bảng tạm thời trong SQL Server

Để trợ giúp với bước chuyển đổi, tôi sử dụng các bảng tạm thời. Là một phần của việc xem xét kịch bản, tôi được yêu cầu sử dụng các biến bảng thay vì các bảng tạm thời. Người đánh giá cho rằng nếu chúng tôi chạy hai lần nhập khác nhau cùng một lúc, bảng tạm thời sẽ được chia sẻ và làm hỏng quá trình nhập.


Câu hỏi:

  • Có đúng là các bảng tạm thời sẽ được chia sẻ nếu chúng ta chạy hai nhập khác nhau cùng một lúc?
  • Mỗi cuộc gọi có gọi tới số EXEC tạo phạm vi mới không?

Đây là ví dụ về kịch bản.

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 

Trả lời

42

Từ CREATE TABLE:

bảng tạm thời địa phương có thể nhìn thấy duy nhất trong phiên hiện tại

và (quan trọng hơn):

Nếu một bảng tạm thời địa phương được tạo ra trong một thủ tục lưu trữ hoặc ứng dụng có thể được thực thi cùng một lúc bởi nhiều người dùng, Cơ sở dữ liệu phải có khả năng phân biệt các bảng được tạo bởi những người dùng khác nhau . Cơ sở dữ liệu thực hiện điều này bằng cách gắn thêm một hậu tố dạng số vào mỗi tên bảng tạm thời cục bộ.

Cách chính xác sẽ trả lại điểm của bất kỳ ai nói rằng họ sẽ được chia sẻ.


Ngoài ra, có không cần phải DROP TABLE vào cuối thủ tục của bạn (từ cùng liên kết lại):

Một bảng tạm thời địa phương được tạo ra trong một thủ tục lưu trữ được giảm tự động khi thủ tục lưu trữ là đã hoàn thành

+1

câu _có thể được thực hiện cùng một lúc bởi nhiều người dùng, Cơ sở dữ liệu phải có thể phân biệt các bảng được tạo bởi những người dùng khác nhau_ là khó hiểu! Dường như * cùng một người dùng * trong các phiên khác nhau chia sẻ bảng tạm thời. Và không phải như thế. – Alex

+0

@ Alex - Tôi đồng ý rằng nó có thể hơi khó hiểu, nhưng thật không may, đó là cách Microsoft đã chọn để cụm từ nó. –

16

Một phiên không thể xem bảng tạm thời của phiên khác. Vì vậy, các nhập khẩu khác nhau sẽ không ảnh hưởng lẫn nhau, bất kể bạn có sử dụng các bảng tạm thời hay các biến bảng.

Ngoại lệ là bảng tạm thời toàn cầu, bắt đầu bằng ##. Những người này có thể nhìn thấy tất cả các kết nối.

20

## được sử dụng cho các bảng tạm thời toàn cầu - sẽ có sẵn cho các mục nhập khác nhau.

# được sử dụng cho các bảng tạm thời cục bộ và chỉ có sẵn trong phạm vi hiện tại/bên trong.

+2

Bảng tạm thời cục bộ cũng hiển thị trong phạm vi bên trong, ví dụ: http://sqlfiddle.com/#!6/d41d8/6725/1 – Andomar

Các vấn đề liên quan