2012-02-06 53 views
9

Tôi đang ở trong tình huống mà tôi phải cập nhật khoảng 12.000 mục trong DB của mình. Mỗi hàng cần phản chiếu một tệp excel mà tôi đã tạo trước đó. Tôi đã tạo tệp tạo từng dòng câu lệnh SQL, nhưng tôi không chắc liệu mình có thể chạy từng dòng trong một truy vấn hay không.Nhiều câu lệnh SQL Update trong một truy vấn

Đây là ví dụ về những gì tôi đang cố gắng làm.

UPDATE [STORESQL].[dbo].[RPT_ITM_D] SET F1301='1.29' WHERE F01='0000000000001' 
UPDATE [STORESQL].[dbo].[RPT_ITM_D] SET F1301='1.39' WHERE F01='0000000000002' 

Điều này có hoạt động hay không có tùy chọn nào tốt hơn cho những gì tôi đang cố gắng đạt được?

Mỗi mục sẽ có giá trị duy nhất và cột cần thay đổi cũng sẽ có giá trị duy nhất. Tôi không thấy làm thế nào tôi có thể làm cho công việc này với một vòng lặp, hoặc bất kỳ phương pháp khác mà tôi đã tìm thấy cho đến nay. Tôi nhận ra rằng điều này có thể mất một thời gian dài để xử lý, nhưng thời gian không phải là một vấn đề.

Cảm ơn bạn trước

Trả lời

8

Có, bạn có thể thêm tất cả các dòng-Cập nhật-tuyên bố trong một truy vấn như bạn đang làm.

16

Something như thế này là tốt nhất bạn có thể làm: -

UPDATE [STORESQL].[dbo].[RPT_ITM_D] 
SET F1301 = 
     case F01 
     when '0000000000001' then '1.29' 
     when '0000000000002' then '1.30' 
end 

Ngoài ra, việc chạy nhiều bản cập nhật là con đường để đi.

+3

Anh ấy đang cố gắng cập nhật 12.000 giá trị duy nhất, tôi không nghĩ Case là tùy chọn hợp lệ ở đây –

+0

@BassamMehanni Tôi hiểu. Tôi đã chỉ ra rằng như xa như giảm số lượng các báo cáo cập nhật, bằng cách sử dụng 'trường hợp' có lẽ là tốt nhất ông có thể làm. – Icarus

1

Nếu bạn có một lượng dữ liệu đáng kể để cập nhật, có thể thuận lợi để tải tệp excel vào cơ sở dữ liệu dưới dạng bảng, sau đó cập nhật bảng của bạn dựa trên dữ liệu trong bảng được tải này.

UPDATE RPT_ITM_D 
     SET F1301 = NewTable.Value 
    FROM RPT_ITM_D INNER JOIN NewTable ON (NewTable.F01 = RPT_ITEM_D.F01); 

Nếu bạn đang sử dụng máy chủ SQL, bạn có thể sử dụng SSIS để tải tệp nhanh chóng.

2

Tôi nghĩ cách tốt nhất là nhập bảng tính Excel vào bảng trong cơ sở dữ liệu SQL của bạn. Từ đó bạn có thể sử dụng phép nối để tạo một câu lệnh cập nhật cho tất cả 12.000 mục.

Để biết thông tin về cách nhập tính Excel vào SQL: http://msdn.microsoft.com/en-us/library/ms141209.aspx

Báo cáo cập nhật sau đó sẽ giống như thế này:

UPDATE itemTable 
SET F1301 = excelTable.<column with your value> 
FROM [STORESQL].[dbo].[RPT_ITM_D] itemTable inner join [STORESQL].[dbo].[importedExcelTableName] excelTable on itemTable.F01 = excelTable.<column with the item code> 

Nếu bạn không chắc chắn nếu điều này sẽ làm việc một cách an toàn, bạn có thể thử truy vấn này cho một giá trị duy nhất bằng cách đơn giản thêm:

WHERE itemTable.F01 = '0000000000001' 
2

Hãy xem ví dụ MERGE một cái gì đó như:

MERGE INTO [STORESQL].[dbo].[RPT_ITM_D] 
    USING (
      VALUES ('1.29', '0000000000001'), 
       ('1.39', '0000000000002') 
     ) AS source (F1301, F01) 
    ON F01 = source.F01 
WHEN MATCHED THEN 
    UPDATE 
     SET F1301 = source.F1301; 

... nhưng sử dụng hàm tạo giá trị bảng theo cách này sẽ không chia tỷ lệ thành 12.000 hàng! Vì vậy, hãy tìm cách sao chép dữ liệu đầu tiên từ Excel sang một bảng trên máy chủ, sau đó sử dụng bảng làm nguồn, ví dụ:

MERGE INTO [STORESQL].[dbo].[RPT_ITM_D] 
    USING [STORESQL].[dbo].MyStagingTable AS source 
     ON F01 = source.F01 
WHEN MATCHED THEN 
    UPDATE 
     SET F1301 = source.F1301; 
0

Bạn có thể sử dụng chức năng tiếp nhau trong Excel để đóng khung một truy vấn, tất cả các bạn cần làm là để đóng khung một truy vấn cập nhật duy nhất và kéo tương tự cho phần còn lại

concatenate ("Cập nhật set =" ,, ", where = " ,, ";")

Sử dụng định dạng trên và kéo ô đến cuối hoặc nhấp đúp vào góc dưới cùng bên phải để Tự động điền vào câu lệnh Cập nhật. Tôi tin rằng đây là cách ngắn nhất có thể và chạy nó trong một Go duy nhất.

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