2009-10-22 38 views
5

Tôi muốn cập nhật bảng có tên là Sorels_ext từ bảng có tên là Sorels. Liên kết giữa chúng là fkey_id của Sorels_ext bằng với identity_column của bảng Sorels. Đây là lần thử đầu tiên của tôi tại câu lệnh Merge và tôi đang cố gắng tìm hiểu cú pháp.Cần trợ giúp với câu lệnh Merge

MERGE Sorels_ext AS SORe 
USING (select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END from Sorels AS SOR) 
ON (SORe.fkey_id = SOR.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END 
WHEN NOT MATCHED THEN 
    INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, SORe.Color = select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END); 

Khi tôi chạy này, tôi nhận được lỗi sau:

Lỗi 2009/10/22 13:38:51 0: 00: 00.000 SQL Server Database Error: cú pháp sai gần từ khóa ' TRÊN'. 46 0

*** INFO THÊM ******

Sau khi sửa chữa đầu tiên gợi ý, các mã được như sau:

MERGE Sorels_ext AS SORe 
USING (select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END from Sorels) AS SOR 
ON (SORe.fkey_id = SOR.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END 
WHEN NOT MATCHED THEN 
    INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END); 

Bây giờ tôi nhận được lỗi sau:

Lỗi 10/22/2009 2:03:29 PM 0: 00: 00.000 Lỗi cơ sở dữ liệu máy chủ SQL: Danh sách cột chèn được sử dụng trong câu lệnh MERGE không thể chứa số nhận dạng nhiều phần. Thay vào đó, hãy sử dụng số nhận dạng một phần. 55 0

******* THÊM THÔNG TIN THÊM ****** Sau khi điều chỉnh từ lời đề nghị, tôi đã điều sau đây:

MERGE Sorels_ext AS SORe 
USING (select SOR1.identity_column, CASE 
     WHEN left(SOR1.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR1.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END as colors from Sorels as SOR1) as SOR 
ON (SORe.fkey_id = SOR.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END 
WHEN NOT MATCHED THEN 
    INSERT (fkey_id, Color) VALUES (SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END); 

tôi nhận được lỗi:

Lỗi 10/22/2009 2:46:51 PM 0: 00: 00.000 Lỗi cơ sở dữ liệu máy chủ SQL: Tên cột không hợp lệ 'FPARTNO'. 56 0

Tôi đang làm gì sai?

**** TÔI GOT IT !!! *****

MERGE Sorels_ext AS SORe 
USING (select SOR.identity_column, CASE 
     WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' 
     WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red' 
     ELSE 'White' 
     END as colors from Sorels as SOR) SOR1 
ON (SORe.fkey_id = SOR1.identity_column) 

WHEN MATCHED THEN 
    UPDATE SET SORe.fkey_id = SOR1.identity_column, SORe.Color = SOR1.colors 
WHEN NOT MATCHED THEN 
    INSERT (fkey_id, Color) VALUES (SOR1.identity_column, SOR1.colors); 
+0

Xin chúc mừng. –

+0

Ngoài ra nhỏ: không có điểm nào trong việc chỉ định 'fkey_id = identity_column', vì truy vấn của bạn đã xác minh rằng chúng có cùng giá trị. –

Trả lời

4

Tôi tin rằng bạn phải bí danh dữ liệu nguồn của bạn của bạn như vậy:

USING (select SOR.identity_column, 
    CASE WHEN left(SOR.FPARTNO, 2) = 'BL' 
    THEN 'Blue'   
    WHEN left(SOR.FPARTNO, 2) = 'RD' 
    THEN 'Red'   
    ELSE 'White'  
    END from Sorels AS SOR) **AS SOR** ON (SORe.fkey_id = SOR.identity_column) 
+1

Đồng ý. Ví dụ OP đang sử dụng bí danh bảng không tồn tại trên JOIN đó. –

+0

Tôi chỉ chỉnh sửa lại lần nữa với hiệu chỉnh đó và lỗi mới. Tôi thực sự đánh giá cao sự kiên nhẫn của bạn. – DavidStein

+0

Tôi đã cập nhật lại. Tôi đang sử dụng bí danh để làm mọi thứ dễ dàng hơn và rõ ràng hơn và dường như chúng có tác dụng ngược lại. – DavidStein

0

Hãy thử đưa ra khỏi "AS" trong ") AS SOR"

5
INSERT (SORe.fkey_id, SORe.Color) 

nên đọc:

INSERT (fkey_id, Color) 

Cột trong danh sách chèn ca n chỉ tham khảo bảng mục tiêu. Trình phân tích cú pháp không mong đợi thấy bí danh bảng ở đó và không biết cách giải quyết nó.

Nếu nó thấy "column1", nó biết nó thuộc về bảng mục tiêu. Nó thấy "table1.column1", nó không biết "table1" có nghĩa là gì, vì "table1" như một mã thông báo nằm ngoài phạm vi.

+0

Tôi đồng ý với Peter về vấn đề này. – rfonn

+0

Điều đó có hiệu quả, nhưng bạn có thể giải thích tại sao không? – DavidStein

+1

Cột trong danh sách chèn chỉ có thể tham chiếu đến bảng đích, do đó trình phân tích cú pháp không mong đợi thấy bí danh bảng ở đó, sẽ không biết cách giải quyết nó. Nó thấy "column1", nó biết nó thuộc về bảng đích. Nó thấy "table1.column1", nó không biết "table1" có nghĩa là gì. "table1" nằm ngoài phạm vi, vì vậy để nói. –

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