2010-09-10 80 views
5

Trong Oracle, bạn có thể tạo một bảng tạm thời sử dụng một cái gì đó như:SQL Server/Oracle: bảng tạm thời Private

CREATE GLOBAL TEMPORARY TABLE temp_table (
    field1 NUMBER, 
    field2 NUMBER 
) 
ON COMMIT DELETE ROWS; 

... mà có thể là khá tiện lợi, vì điều này sẽ tạo ra một bảng có thể nhìn thấy tất cả mọi người, nhưng dữ liệu một INSERTs vào bảng chỉ hiển thị cho người đó. Ngoài ra, dữ liệu đó sẽ tự động bị xóa vào cuối giao dịch hoặc phiên (tùy thuộc vào tuyên bố của nó), để dữ liệu tạm thời của mọi người khác không bị tổn hại.

Trong SQL Server, tuy nhiên, bạn có thể tạo một bảng temp với:

CREATE TABLE #temp_table (field1 INT, field2 INT); 

... mà, như tôi hiểu nó, là đáng kể và chức năng khác biệt so với thực hiện của Oracle. Bảng tạm thời này chỉ hiển thị đối với bạn và được thả (bảng) ngay sau khi sử dụng.

Có bất kỳ khả năng nào trong SQL Server để bắt chước hành vi của Oracle như được mô tả ở trên không? Hoặc là cách duy nhất để làm việc với dữ liệu tạm thời liên quan đến việc phải liên tục TẠO bảng tạm thời với mỗi lần lặp lại công việc?

+0

bạn có thể giải thích lý do bạn muốn bắt chước hành vi của Oracle trong SQLServer không? Là nó chỉ để tránh yêu cầu để thực hiện câu lệnh CREATE TABLE? –

+0

@Mark ~ tốt, đó là chủ yếu. Nhưng nếu tôi đang xử lý (1) chèn dữ liệu tạm thời lặp đi lặp lại, (2) với cùng định dạng dữ liệu và trường, (3) và là người dùng duy nhất (tức là dữ liệu riêng tư cho phiên người dùng), ý nghĩa để xử lý tất cả những gì trong một bảng theo cách thực hiện của Oracle. :) –

+0

[Bảng tạm thời riêng tư của Oracle] (https://stackoverflow.com/a/48852466/5070879) – lad2025

Trả lời

9

Như bạn đã phát hiện ra SQL Server & Các bảng tạm thời của Oracle về cơ bản là khác nhau.

Trong bảng tạm thời toàn cầu của Oracle là các đối tượng cố định lưu trữ dữ liệu cụ thể của phiên tạm thời (hoặc giao dịch cụ thể).

Trong bảng tạm thời của SQL Server là các đối tượng tạm thời lưu trữ dữ liệu tạm thời, với #temp_tables lưu trữ dữ liệu cục bộ cho phiên và ## temp_tables lưu trữ dữ liệu toàn cục. (Tôi chưa bao giờ có nhu cầu về các bảng tạm thời của SQL Server toàn cầu và không biết họ giải quyết vấn đề gì.) Nếu #temp_table được tạo trong một thủ tục lưu sẵn, nó sẽ bị loại bỏ khi thủ tục lưu sẵn thoát. Nếu không, nó sẽ bị xóa khi phiên đóng.

Và không, có thực sự không phải là một cách để làm cho SQL Server bắt chước Oracle. Bạn có thể sử dụng một bảng bình thường với một cột phụ lưu trữ một ID phiên. Nhưng bạn sẽ không nhận được những ưu điểm của bảng tạm thời đối với việc đăng nhập ít hơn. Bạn sẽ phải xóa dữ liệu tạm thời theo cách thủ công. Và đối phó với việc làm sạch từ các phiên bỏ thuốc sớm.

EDIT: Sự khác biệt giữa Oracle và SQL Server là SQL Server cho phép DDL được bao bọc trong giao dịch với các câu lệnh khác. Vì vậy, nếu bạn cần sử dụng bảng tạm thời như là một phần của giao dịch lớn hơn, câu lệnh create table #table_name... sẽ không ngầm cam kết giao dịch hiện tại như tuyên bố create table sẽ trong Oracle.

+0

~ tương tự như vậy, tôi không thể có được đầu của tôi xung quanh SQL Server ## temp_tables là tốt. :) Phải thừa nhận rằng, tôi muốn có một thực hiện theo Oracle, nhưng nếu đó là chỉ đơn giản là không thể trong SQL Server, sau đó đề xuất của bạn/s dường như làm cho ý nghĩa nhất. Cảm ơn! +1 –

+0

Tôi có một đồng nghiệp đã tìm thấy việc sử dụng ## temp_tables - anh ấy sử dụng SSIS cho một số quy trình và nếu bạn sử dụng ## trong một proc và proc gọi proc khác, proC# 2 có thể sử dụng ## temp_table. – user158017

+0

@sql_mommy: Tôi đã có một đồng nghiệp đã làm một điều tương tự, trong đó họ đang sử dụng ## bảng để sử dụng trên procs. Tuy nhiên, họ không có cách nào ngăn chặn người dùng cuối khởi động quá trình tương tự trong khi một người khác đã chạy, do đó, chạy rủi ro rằng công việc từ hai người dùng sẽ được trộn lẫn với nhau trong bảng tạm thời toàn cầu. Chúng tôi đã chuyển các định nghĩa bảng tạm thời sang proc trên cùng, vì vậy tất cả các procs đều có thể nhìn thấy chúng và tạo các bảng tạm thời cục bộ. Đối với SSIS, nếu đó là một quá trình xử lý hàng loạt được khởi động bởi một công việc, có thể là OK. –

1

Đây là off topic nhưng bạn có biết rằng trong SQL Server bạn có thể tạo một bảng temp như thế này:

select * 
into #temp_table 
from mytable 
+0

Yup, tôi đã làm. Cảm ơn bạn đã chỉ ra nó. –

1

bảng Temp trong SQL có thể rất hữu ích khi bạn cần phải kết hợp dữ liệu từ các nguồn khác nhau mà có trường hợp nhất chung, nhưng bạn cần tổng số tiền trước khi hợp nhất để so sánh tổng số ròng cho hai nguồn. Trong một hệ thống tài chính hữu ích. Tôi đã thất vọng khi chúng tôi chuyển từ SQL Server sang Oracle vì tôi đã mất chức năng đó.

Ví dụ bên dưới dành cho việc triển khai tài chính PeopleSoft. Mô-đun ngân sách (bảng KK) và sổ kế toán tổng hợp (tạp chí) phải có cùng số dư cho một quỹ khi giao diện đã được chạy giữa hai.Truy vấn dưới đây tổng số tiền ngân sách theo quỹ từ các bảng KK và lưu trữ các bảng trong bảng tạm thời, sau đó tổng số tiền tương ứng bằng quỹ từ sổ cái chung, sau đó hợp nhất hai bảng dữ liệu được tổng hợp trước để cho phép so sánh số tiền ròng trên mỗi quỹ hai nguồn - và liệt kê các kết quả chỉ khi có sự khác biệt giữa số tiền cho một quỹ. Trong trường hợp đó, các mô-đun ngân sách và GL không đồng bộ. Đây thực sự là một giải pháp khá thanh lịch và không cần tạo bảng tạm thời toàn cầu cho những người khác cho truy vấn/báo cáo này.

Tôi hy vọng ai đó thấy điều này hữu ích. Nó đã giúp tôi vào thời điểm đó.

/*** START NESTED QUERY #1            ***/ 
/*** THE FOLLOWING CREATES TWO TEMP TABLES WITH NET AVAILABLE PER FUND ***/ 
/*** WITH ONE AMOUNT BASED ON KK TABLES AND ONE AMOUNT BASED ON  ***/ 
/*** BUDGETARY GL BALANCES. THEN TEMP TABLES ARE MERGED BY FUND AND ***/ 
/*** NET DIFFERENCE CALCULATED-SELECTING FUNDS WITH DIFFERENCES.  ***/ 
/*** IF BUDGET CHECKING IS COMPLETE AND JOURNALS CREATED AND POSTED ***/ 
/*** THERE SHOULD BE NO DIFFERENCES.         ***/ 

--create a temp table with journal amounts summed by fund code 
CREATE TABLE #JRNLsum(
FUND_CODE char(5), 
JRNLAMT decimal(19,2)) 
INSERT INTO #JRNLsum (FUND_CODE, JRNLAMT) 
select FUND_CODE, sum(MONETARY_AMOUNT * -1) JRNLAMT 
FROM PS_JRNL_LN 
INNER JOIN PS_JRNL_HEADER 
ON PS_JRNL_LN.JOURNAL_ID = PS_JRNL_HEADER.JOURNAL_ID 
where ((ACCOUNT BETWEEN 430000 and 469999) and (FISCAL_YEAR >= '2009')) 
GROUP BY FUND_CODE order by FUND_CODE 


--create a temp table with KK ledger amounts summed by fund code 
CREATE TABLE #KKsum(
FUND_CODE char(5), 
KKAMT decimal(19,2)) 
INSERT INTO #KKsum (FUND_CODE, KKAMT) 
select FUND_CODE, sum(POSTED_TOTAL_AMT * -1) KKAMT 
from PS_LEDGER_KK where LEDGER like 'FUND_%' 
group by FUND_CODE order by FUND_CODE 

--join kk temp date to journal temp data, keep only 
--fund code, kk net amount, and journal net amount 
--and select only fund codes where there is a difference 
--between kk net amount and journal net amount 
select #KKsum.FUND_CODE, JRNLAMT, KKAMT from #JRNLsum 
INNER JOIN #KKsum 
on #KKsum.FUND_CODE=#JRNLsum.FUND_CODE 
where (JRNLAMT - KKAMT) <> 0.00 


--drop the two temp tables 
drop table #KKsum 
drop table #JRNLsum 

/*** END NESTED QUERY #1 
Các vấn đề liên quan