2013-06-07 37 views
5

Đây là những gì tôi phải làm:SQl: Cập nhật Bảng từ một tệp văn bản

Tôi có tệp văn bản có 3 cột: PID, X, Y.

Bây giờ tôi có hai bảng trong cơ sở dữ liệu của tôi:

  • Table 1 chứa 4 cột: UID, PID, X, Y
  • Table 2 chứa nhiều cột, những người cần được UID, X, Y

Tôi cần cập nhật Table 2 với tương ứng Giá trị X và Y.

Tôi nghĩ chúng tôi có thể sử dụng BULK INSERT để cập nhật table 1, sau đó một số vòng lặp WHILE hoặc thứ gì đó.

Nhưng tôi không thể tìm ra điều chính xác.

+0

Không rõ ràng - bạn muốn 'BULK INSERT' tệp văn bản vào' Table1' và sau đó cập nhật 'Table2' từ đó? Hay cái gì? Ngoài ra: ** loại dữ liệu ** của các cột đó là gì? Bạn có thể hiển thị cho chúng tôi một tệp văn bản mẫu ** không? –

+0

Vui lòng báo giá phiên bản SQL Server của bạn (bạn có thể thêm một thẻ cụ thể hơn) – Paul

Trả lời

8
CREATE PROCEDURE [dbo].[BulkInsert]    
(   
@PID int ,   
@x int,   
@y int,   

)    
AS    
BEGIN    
SET NOCOUNT ON;    

declare @query varchar(max)    


CREATE TABLE #TEMP    
(   
[PID] [int] NOT NULL ,   
[x] int NOT NULL,   
[y] int NOT NULL,    

)    


SET @query = 'BULK INSERT #TEMP FROM ''' + PathOfYourTextFile + ''' WITH (FIELDTERMINATOR = '','',ROWTERMINATOR = ''\n'')'    
--print @query    
--return    
execute(@query)    


BEGIN TRAN;    

MERGE TableName AS Target    
USING (SELECT * FROM #TEMP) AS Source    
ON (Target.YourTableId = Source.YourTextFileFieldId) 
-- In the above line we are checking if the particular row exists in the table(Table1) then update the Table1 if not then insert the new row in Table-1.   

WHEN MATCHED THEN    
UPDATE SET    
Target.PID= Source.PID, Target.x= Source.x, Target.y= Source.y   
WHEN NOT MATCHED BY TARGET THEN    

-- Insert statement 

Bạn có thể sử dụng phương pháp trên để giải quyết vấn đề của mình. Hi vọng điêu nay co ich. :)

+0

Chúc các bạn có lời cảm ơn ... – Spandan

+0

Đủ cho tôi ... :) –

2

Bạn sẽ chạy nó như thế nào? Từ một thủ tục lưu sẵn?

Để tiết kiệm một số hiệu suất, tôi đã có thể làm BULK INSERT để bảng temp, sau đó chèn từ bảng temp bảng 1 & 2.

Nó sẽ giống như thế này

INSERT INTO Table1 (PID, X, Y) 
SELECT PID, X, Y 
FROM #tempTable 

Một số sẽ cho rằng tạm thời bảng là không tốt, nhưng nó thực sự phụ thuộc - nếu bạn tập tin là lớn, đọc nó từ đĩa sẽ mất thời gian và bạn không muốn làm điều đó hai lần.

+0

có hình thức một proc được lưu trữ ... tôi muốn biết, làm thế nào để bạn đạt được bước 2, chèn từ bảng tạm thời lên bảng 2? – Spandan

+0

Tốt hơn để tải bảng 1 trước, sau đó tải bảng 2 bằng cách sử dụng bảng 1 làm nguồn. Bảng 1 có liên kết giữa 'uid' và' pid' cần thiết để tải Bảng 2. –

1

Bạn không cần bất kỳ vòng lặp nào để cập nhật bảng 2; tất cả những gì bạn cần là insert từ bảng 1.

Hoặc nếu bạn đang cố gắng cập nhật các hàng hiện có trong bảng 2, hãy sử dụng truy vấn update tham gia trên bảng 1. See this question for an example.

Tuy nhiên, bạn nên xem xét thay đổi thiết kế cơ sở dữ liệu của mình, vì nó có vẻ không chính xác: bạn đang lưu trữ XY ở hai nơi; chúng chỉ nên được lưu trữ trong một bảng và bạn nên tham gia vào bảng này nếu bạn cần sử dụng chúng cùng với các dữ liệu khác. Nếu bạn đã làm điều này, bạn sẽ không phải lo lắng về vấn đề lộn xộn của việc giữ hai bảng đồng bộ.

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