2012-01-18 56 views
5

Tôi đang sử dụng bảng tạm thời toàn cầu Oracle 11g vì tôi cần một giải pháp để tôi có thể thêm hàng vào bảng tạm thời để tham gia và tôi chỉ muốn các hàng được thêm vào bảng tạm thời Oracle kết nối/phiên để được bao gồm. Tôi đang sử dụng Global Temp Table trong Oracle bởi vì tôi muốn bảng tồn tại giữa các phiên vì vậy nó không phải được tái tạo mỗi khi tôi tạo một truy vấn. Điều này đang làm việc tốt.Bảng tạm thời toàn cầu - SQL Server và Oracle

định nghĩa bảng Oracle của tôi là như sau:

CREATE GLOBAL TEMPORARY TABLE book_id_temp 
( 
    book_id RAW(32) 
)ON COMMIT DELETE ROWS; 

tôi có cấu trúc cơ sở dữ liệu tương tự cũng trên SQL Server 2008 R2-bên, và cần một giải pháp tương tự trong SQL Server. Tôi muốn:

  1. Mở một kết nối SQL (ADO.NET)
  2. Trong giao dịch:
  3. hàng -Thêm vào một bảng temp.
  4. -Hãy đưa họ lên một bảng khác, CHỌN kết quả
  5. -Chỉ có các hàng được thêm vào trong phiên này mới được bao gồm trong kết hợp. Một luồng khác có thể được thực hiện trên cùng một bảng tạm thời. Có thể sau đó một bảng tạm thời địa phương sẽ là tốt nhất ở đây?
  6. Hoàn nguyên toàn bộ giao dịch.

Từ những gì tôi đã đọc về các bảng tạm thời toàn cầu trong SQL Server, các bảng tồn tại sau khi kết nối được kết thúc, như bảng thông thường và như Bảng tạm thời toàn cầu trong Oracle. Tuy nhiên, nó không rõ ràng về phạm vi của dữ liệu. Chỉ có phiên SQL Server mà tạo ra các hàng có quyền truy cập vào nó, giống như trong Oracle? Khả năng truy cập của dữ liệu với SQL Server Global Temp Tables là gì? Bạn có gợi ý nào khác để đạt được mục tiêu của mình không?

+0

bảng Temp Oracle toàn cầu cũng cần phải được rút ngắn, tùy thuộc vào hoạt động ... Tôi muốn sử dụng một biến bảng trong một bảng temp trong SQL Server cho sự lựa chọn, nhưng bạn cần phải giải thích nhu cầu của bạn cho sự kiên trì khi kết nối bị mất để có được sự giúp đỡ thực sự. Tại sao không chỉ làm một bảng thực tế? –

+0

Tôi muốn bảng tồn tại giữa các phiên sao cho nó không phải được tạo lại mỗi lần tôi tạo truy vấn. –

+0

Nó * âm thanh * như bạn muốn một bảng tạm thời cục bộ, chứ không phải là một bảng tạm thời toàn cầu. Bạn có thể mô tả ngữ nghĩa bạn * yêu cầu * không? –

Trả lời

6

Bảng tạm thời trong Oracle là các đối tượng cố định giữ dữ liệu tạm thời là phiên cục bộ. Các bảng tạm thời trong SQL Server là các đối tượng tạm thời.

  1. Trong SQL Server, bảng tạm thời chứa dữ liệu hiển thị cho tất cả các phiên. "Bảng tạm thời toàn cầu được hiển thị cho bất kỳ người dùng nào và bất kỳ kết nối nào sau khi chúng được tạo." http://msdn.microsoft.com/en-us/library/ms186986.aspx
  2. Bảng tạm thời toàn cầu vẫn là các đối tượng tạm thời không tồn tại vô thời hạn và có thể cần được tạo trước khi sử dụng. "Bảng tạm thời toàn cầu được ... bị xóa khi tất cả người dùng đang tham chiếu bảng ngắt kết nối khỏi phiên bản SQL Server." http://msdn.microsoft.com/en-us/library/ms186986.aspx

Tôi thấy rằng một bảng tạm thời địa phương, hoặc biến bảng, là gần nhất để trở thành như vậy để bảng temp toàn cầu của Oracle, sự khác biệt lớn nhất là bạn phải tạo ra nó mỗi lần.

Thông thường, trong một trường hợp như của bạn, bước 3, thêm hàng để bảng temp, sẽ được thực hiện bằng cách làm một select ... into #temp_table_name .... (tương đương với Oracle create table ... as select ...) http://msdn.microsoft.com/en-us/library/ms188029.aspx

Ngoài ra, bạn không thể làm như sau trong một proc được lưu trữ: (mã giả.)

begin proc 
    call another proc to create local temp table. 
    use temp table 
end proc 

Bảng tạm thời cục bộ bị hủy khi trở về từ quy trình được lưu trữ đã tạo chúng.

Cập nhật 2014-10-14: Hành vi của bảng tạm thời cục bộ khác nhau trong phiên bản Parallel Data Warehousev của SQL Server. Các bảng tạm thời không bị loại bỏ khi thoát khỏi thủ tục đã lưu trữ đã tạo ra chúng, và thay vào đó tiếp tục tồn tại trong phần còn lại của phiên. Hành vi này được quan sát trên:

select @@version 
Microsoft SQL Server 2012 - 10.0.5108.1 (X64) Jun 24 2014 20:17:02 Copyright (c) Microsoft Corporation Parallel Data Warehouse (64-bit) on Windows NT 6.2 <X64> (Build 9200:) 
1

Nếu bạn tự tạo các bảng trong cơ sở dữ liệu tempdb, bạn đạt được nhiều hơn hoặc ít tác dụng tương tự:

USE tempdb; 

CREATE TABLE foo... 

và sau đó giải quyết chúng:

select * from tempdb..foo 

Các bảng này sẽ không bị xóa giữa phiên . Tuy nhiên, bạn cần phải cắt chúng theo cách thủ công, không tương đương với các lệnh ON COMMIT DELETE ROWS.

+0

Triển khai ADO.NET hiện tại của tôi là sau khi tôi chèn bản ghi vào bảng tạm thời và thực hiện Tham gia, tôi thực hiện Rollback() trên IDbConnection, để thực sự có thể là đủ. Bạn nói rằng bảng sẽ không bị xóa, nhưng còn nội dung của nó thì sao? Tôi nghĩ rằng, nếu tôi không bao giờ thực sự cam kết giao dịch, không có kết nối hoạt động nào khác thậm chí có thể truy cập dữ liệu –

+0

Nó sẽ hoạt động, nhưng nó cực kỳ kém hiệu quả. Rollbacks trong SQL Server là rất dễ bị khóa và chậm, đặc biệt là cho dữ liệu lớn. Hiệu quả hơn nhiều để sử dụng các bảng tạm thời cấp phiên hoặc nếu bạn nhấn mạnh vào việc có một bảng toàn cục, để cắt bớt nó sau khi bạn đã hoàn thành. –

1

Nếu bạn tạo Bảng toàn cầu tạm thời (## table) trong SQL Server, nó sẽ 'hoạt động' và có thể truy cập được qua các phiên khác cho đến khi phiên đó được đóng lại. Ngoài ra, bạn sẽ không thể tạo Bảng Nhiệt độ Toàn cầu dưới cùng tên cho một phiên khác cho đến khi phiên ban đầu đóng, bạn sẽ nhận được rằng bảng đã tồn tại. Vì mục đích của bạn, Global Temp Table không phải là một giải pháp tốt.

Bảng địa phương (#table) sẽ tốt hơn nhiều và sẽ đạt được những gì bạn đang tìm kiếm.

Hy vọng điều này sẽ giúp

+0

là bản ghi của bảng tạm thời chỉ có thể truy cập trong giao dịch mà chúng được tạo ra? Tôi không muốn tạo bảng cho mỗi truy vấn. –

+0

Không, các bản ghi trong bảng tạm thời của SQL Server (## table_name) được hiển thị cho tất cả các phiên. –

4

Bảng tạm thời trên máy chủ SQL mặc định là cục bộ. Bảng sẽ bị hủy sau khi phiên kết thúc. Nếu bạn thực thi một tập lệnh như:

create table #Foo (
     FooID int 
     ,FooCode1 varchar (20) 
) 

insert table #Foo (FooID, FooCode1) 
values (1001, 'X') 

insert table #Foo (FooID, FooCode1) 
values (1002, 'Y') 

select f.FooID 
     ,f.FooCode1 
     ,b.BarID 
     ,b.BarCode1 
    from #foo f 
    join bar b 
    on bar.FooID = f.FooID -- (or whatever predicate) 

Truy vấn sẽ chỉ trả về các hàng tham gia vào những gì bạn đã chèn vào #Foo trong phiên này. #Foo là địa phương cho phiên; bạn có thể có nhiều phiên với bảng tạm thời #Foo của riêng mình mà không phải lo lắng về xung đột không gian tên.Khi phiên được đóng, bảng tạm thời sẽ bị hủy bỏ. Bạn cũng có thể thả #Foo một cách rõ ràng sau khi bạn đã hoàn tất với nó nếu bạn đang sử dụng kết nối cơ sở dữ liệu liên tục (ví dụ: ứng dụng máy khách-máy tính để bàn).

+0

Tôi tạo IDbConnection và quản lý giao dịch (không liên tục) và đóng kết nối. Khi kết nối đóng, phiên làm việc đó có đúng không? –

+0

Có, nếu bạn đóng kết nối, phiên sẽ đóng. – ConcernedOfTunbridgeWells

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