2012-03-30 49 views
5

Tôi muốn chèn bản ghi vào một TempTable. Một cái gì đó như thế này:INSERT INTO SELECT - số lượng lớn hồ sơ

insert into ##tempT 
SELECT * FROM MyTable 

MyTable chứa một lượng lớn bản ghi để chèn "" vào một thời gian dài.

Nếu tôi cố gắng chạy:

SELECT COUNT(*) FROM ##tempT 

nó trả luôn "0" cho đến khi tất cả hồ sơ từ "MyTable" được chèn vào bởi INSERT INTO lệnh.

Làm cách nào để có được số lượng tiến trình cho tôi biết số lượng bản ghi trong ## tempT?

Tôi cần cập nhật giá trị thanh tiến trình trong khi lệnh SQL đang chạy.

Cảm ơn bạn.

+0

vì tò mò tại sao bạn chèn dữ liệu vào bảng tạm thời? – Baz1nga

Trả lời

8

thử

set transaction isolation level read uncommitted 
SELECT COUNT(*) FROM ##tempT 
+5

Điểm tốt, hoặc tốt hơn: 'select count (*) từ ## TempT with (nolock)' để tránh ảnh hưởng đến trạng thái kết nối. – Ben

+0

Cả hai 'đọc uncommited' và' nolock' sẽ làm việc trong kịch bản của bạn. Tuy nhiên, chúng đều là vũ khí nguy hiểm, do đó, không sử dụng chúng trong các tình huống thao tác dữ liệu (thanh tiến trình là ok). – SWeko

+0

mát mẻ, thậm chí tốt hơn :) – Diego

1

Bạn có thể chia truy vấn của bạn lên.

x = number of records in MyTable/100 
i = 0 

do until we're done 
    queryString = "insert into ##tempT " 
    queryString += "select top " + x " + " * FROM MyTable " 
    queryString += "where RecordNumber > " + i 

    Execute queryString 
    Update Progress Bar 
    i = i + x 
loop 

Bạn sẽ nhận thấy rằng bạn sẽ cần một số loại trường RecordNumber để thực hiện công việc này. Có nhiều cách khác nhau để bạn có thể tìm kiếm.

+0

giải pháp của Ben (bình luận về câu trả lời của Diego) có lẽ là tốt nhất cho kịch bản cụ thể của bạn. Giải pháp của tôi là tốt hơn rất nhiều khi bạn đang giới hạn trong một chủ đề duy nhất và chủ đề đó đang làm việc cập nhật DB và phản hồi GUI như chúng ta thường phải làm lại trong vb6 ngày. –

+2

Đây là một giải pháp khủng khiếp cho các tiêu chuẩn ngày nay. – JotaBe

+0

@JotaBe Vâng, bây giờ điều đó chỉ làm tổn thương cảm xúc của tôi. Xin lỗi câu trả lời của tôi đã không làm hài lòng bạn. –

1

Sử dụng thủ tục đã lưu và DECLARE biến COUNT và coi đây là biến lặp và mỗi lần chèn xong, tăng COUNT bằng 1 và tiếp tục in bằng truy vấn khác bất cứ khi nào bạn muốn biết số. số này từ thủ tục và đọc nó vào chương trình của bạn để cập nhật thanh tiến trình. :)

+0

Bạn cũng có thể ghi lại nó trong một hàng đợi và sau đó đẩy nó như là một giao dịch với bảng DB trong trường hợp bạn donot cần phải cập nhật nó trong TempTable ngay lập tức. Nó có thể cải thiện hiệu suất và có thể được thực hiện ngoại tuyến quá. – Milee

+0

quá trình chèn đang được thực hiện trong một đợt. giải pháp này sẽ không làm việc – Diego

+0

Đó là về chèn vào hàng đợi không phải là một bảng. – Milee

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