2008-09-26 31 views
26

Tôi có một ứng dụng ASP.NET đa người dùng chạy trên SQL Server và muốn có StoredProcA tạo bảng #temptable temp - không phải là biến bảng - để chèn một số dữ liệu, sau đó nhánh tới StoredProcB , StoredProcC và StoredProcD để thao tác dữ liệu trong #temptable cho mỗi quy tắc kinh doanh.SQL Server Temp Tables và kết nối Pooling

Ứng dụng web sử dụng kết nối tổng hợp khi nói chuyện với SQL. Tôi sẽ nhận được một khu vực xướC#temptable mới cho mỗi cuộc gọi của StoredProcA? Hoặc việc chia sẻ kết nối có thể chia sẻ #temptable giữa những người dùng không?

Trả lời

37

Kết nối tổng hợp (với bất kỳ phiên bản SQL Server hiện đại nào) sẽ gọi sp_reset_connection khi sử dụng lại kết nối. Điều này được lưu trữ proc, trong số những thứ khác, drops any temporary tables mà kết nối sở hữu.

+0

OK, bây giờ tuyên bố này hợp lý với tôi: "Khi bảng được bắt đầu bằng dấu '#' đơn, bảng được xác định là bảng tạm thời cục bộ và phạm vi của nó được giới hạn trong phiên mà nó được tạo." Từ "phiên" khiến tôi bối rối! – marc

+0

Làm thế nào về các bảng tạm thời có thể nhìn thấy trên toàn cầu (## tableName)? –

+0

Bảng tạm thời toàn cầu không được kết nối với một kết nối - vì vậy chúng sẽ không bị loại bỏ. –

1

Để chia sẻ bảng tạm thời giữa những người dùng, hãy sử dụng hai băm trước tên ## like_this.

Trong trường hợp này, hãy đảm bảo bạn thực hiện các bước để tránh xung đột với nhiều phiên bản của chương trình.

6

Bảng ## sẽ được tất cả người dùng chia sẻ. Tôi cho rằng đây không phải là ý định của bạn.

Một bảng # temp duy nhất hiển thị cho tất cả các thủ tục được lưu trữ trong ngăn xếp cuộc gọi, nhưng không hiển thị bên ngoài phạm vi đó. Nếu bạn có thể có một cuộc gọi Proc A B, C, và D, bạn sẽ được OK.

Chỉnh sửa: Quy trình báo cáo tôi nên thực hiện ngay bây giờ rất giống như vậy. :) Tôi tạo một bảng tạm thời (#results) trong proc gốc được gọi bởi ứng dụng, sau đó thực hiện một số dữ liệu phức tạp mangling trong một loạt các thủ tục con, đến 1) mã lặp lại trừu tượng và 2) giữ cho thủ tục gốc không chạy tới 500 dòng.

+0

Vâng, đó là nó chính xác. Cảm ơn! – marc

+0

Great S.O. câu hỏi bằng cách này; một câu hỏi mà mọi người hỏi tại một số điểm.Tôi đặt cược đây sẽ là một trong những câu hỏi thúc đẩy lưu lượng truy cập của Google ở ​​đây và ít nhất nó sẽ bị bạc một ngày nào đó. –

2

#temptable không tồn tại trong quá trình kết thúc quy trình được khai báo, vì vậy người dùng khác sẽ không bao giờ thấy nó.

Chỉnh sửa: Heh, hóa ra là "khả năng hiển thị lồng nhau" của bảng tạm thời đã hoạt động kể từ SQL Server 7.0, nhưng tôi chưa bao giờ cập nhật bất kỳ mã nào của mình để tận dụng điều này. Tôi đoán tôi đang hẹn hò bản thân mình - rất nhiều người có thể không tưởng tượng được địa ngục đó là SQL Server trong 6.0 và 6.5 ngày ...

+1

#temptable có phạm vi kết nối, không phạm vi thủ tục. –

+1

Tôi sợ bạn đã sai. –

+0

Và đây là một trích dẫn cho rằng: http://decipherinfosys.wordpress.com/2007/05/04/temporary-tables-ms-sql-server/ –

0

Bảng tạm thời được tạo bằng tên mangling dưới mui xe nên không có không xung đột giữa các cuộc gọi thủ tục được lưu trữ khác nhau.

Nếu bạn cần thao tác cùng một dữ liệu tạm thời trong các cuộc gọi thủ tục lưu trữ tiếp theo, tốt nhất là chỉ cần đi với một bảng thực và sử dụng một số loại định danh duy nhất để đảm bảo bạn chỉ xử lý dữ liệu có liên quan. Nếu dữ liệu chỉ có giá trị tạm thời, hãy xóa thủ công sau khi bạn hoàn tất.

2

Từ các tài liệu MS:

http://msdn.microsoft.com/en-us/library/ms177399(SQL.90).aspx

Bàn Temporary

bảng tạm thời tương tự như bảng vĩnh viễn, trừ bảng tạm thời được lưu trữ trong tempdb và sẽ bị xóa tự động khi họ không còn được sử dụng nữa.

Có hai loại bảng tạm thời: cục bộ và toàn cục. Chúng khác nhau về tên, khả năng hiển thị và tính sẵn có của chúng.Bảng tạm thời cục bộ có ký hiệu số đơn (#) làm ký tự đầu tiên của tên; chúng chỉ hiển thị đối với kết nối hiện tại cho người dùng và chúng sẽ bị xóa khi người dùng ngắt kết nối khỏi phiên bản SQL Server.

Bảng tạm thời toàn cầu có hai ký hiệu số (##) làm ký tự đầu tiên của tên; chúng được hiển thị cho bất kỳ người dùng nào sau khi chúng được tạo và chúng sẽ bị xóa khi tất cả người dùng tham chiếu bảng ngắt kết nối khỏi cá thể của SQL Server.

Ví dụ, nếu bạn tạo bảng nhân viên, bảng có thể được sử dụng bởi bất kỳ người nào có quyền bảo mật trong cơ sở dữ liệu để sử dụng, cho đến khi bảng bị xóa. Nếu một phiên làm việc cơ sở dữ liệu tạo ra bảng tạm thời #employees cục bộ, chỉ phiên làm việc mới có thể làm việc với bảng và nó sẽ bị xóa khi phiên ngắt kết nối. Nếu bạn tạo bảng tạm thời toàn cầu ## nhân viên, bất kỳ người dùng nào trong cơ sở dữ liệu đều có thể làm việc với bảng này. Nếu không có người dùng nào khác làm việc với bảng này sau khi bạn tạo bảng, bảng sẽ bị xóa khi bạn ngắt kết nối. Nếu người dùng khác làm việc với bảng sau khi bạn tạo nó, SQL Server sẽ xóa nó sau khi bạn ngắt kết nối và sau khi tất cả các phiên khác không còn sử dụng nó nữa.

Ngoài ra từ Curt người sửa chữa sai lầm của cách của tôi và chỉ trong trường hợp bạn bỏ lỡ trích dẫn trong các bình luận:

http://msdn.microsoft.com/en-us/library/ms191132.aspx

  • Nếu bạn tạo một địa phương tạm thời bảng bên trong một thủ tục lưu trữ, bảng tạm thời chỉ tồn tại cho các mục đích của thủ tục được lưu trữ; nó biến mất khi bạn thoát khỏi thủ tục được lưu trữ.

  • Nếu bạn thực hiện một thủ tục lưu trữ gọi một thủ tục lưu trữ, được gọi là thủ tục lưu trữ có thể truy cập tất cả các đối tượng được tạo ra bởi thủ tục lưu trữ đầu tiên, bao gồm bảng tạm thời.

+1

Ông nói cụ thể rằng ông đang sử dụng thủ tục được lưu trữ. Những gì bạn nói là đúng nếu bảng tạm thời là ở "cấp cao nhất" của kết nối, nhưng khi nó được sử dụng bên trong một thủ tục được lưu trữ, nó sẽ tự động giảm ở cuối. Tôi sẽ tìm một trích dẫn trong các tài liệu chính thức. –

+1

"Nếu bạn tạo một bảng tạm thời cục bộ bên trong một thủ tục được lưu trữ, bảng tạm thời chỉ tồn tại cho các mục đích của thủ tục được lưu trữ; nó biến mất khi bạn thoát khỏi thủ tục được lưu trữ." @ http://msdn.microsoft.com/en-us/library/ms191132.aspx –

+0

Hi Curt - điểm lấy và hiểu và xin lỗi :) – Kev

1

Tôi tìm thấy sự tương tác của các đối tượng bảng tạm thời/buổi/kết nối/kết nối tổng hợp khá khó hiểu ... :( Mark, tuyên bố của bạn là một trong những rõ ràng nhất mà tôi đã tìm thấy làm rất nhiều và Google nghiên cứu MSDN. Tuy nhiên, tôi muốn biết nguồn gốc của tuyên bố của bạn.

và ai đó có thể xin giải thích sự khác biệt giữa phiên và kết nối với tôi? tôi không thể tìm thấy bất kỳ sự kiện khó khăn về điều đó.

dường như cũng là một vấn đề trong thuật ngữ, tôi nghĩ: Nếu bạn "đóng" một connec tion, nó có thể được phát hành cho các hồ bơi kết nối, do đó, kết nối vẫn (một thời gian) mở ... arghs ... Làm thế nào bạn có thể phân biệt giữa một hương vị gần gũi và hương vị khác của đóng ?!

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