NẾU KHÔNG NULL thì CẬP NHẬT khác giữ giá trị của trường


10

Tôi nghĩ rằng tôi bằng cách nào đó gần để làm cho nó hoạt động, nhưng vì một số lý do tôi vẫn nhận được lỗi.

Tôi có truy vấn CẬP NHẬT sau:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' THEN @Accessories
          WHEN 'Description' THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

Các thông số được điền bởi người dùng khác nhau. Vấn đề tôi gặp phải bây giờ là ngay cả khi bạn muốn cập nhật một trường duy nhất, bạn vẫn phải điền vào dữ liệu cũ các tham số khác. Do đó, tôi muốn đặt tùy chọn IF @parameter IS NULL THEN giữ giá trị đã được lưu trữ trong DB. Tôi đã cố gắng tìm một số giải pháp và một cái gì đó giống như truy vấn sau đây có vẻ là giải pháp nhưng tôi không thể làm cho nó hoạt động:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' IS NOT NULL THEN @Accessories
          WHEN 'Description' IS NOT NULL THEN @Description
          WHEN 'Specification' IS NOT NULL THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

DB được lưu trữ trong SQL Server 2008

Xin được cảm ơn trước về sự giúp đỡ.

EDIT để làm rõ:

Bảng gốc trông như thế này

DeviceID|Name         |Details   |
     10 |Accessories  |earplugs  |
     10 |Description  |protectors|
     10 |Specification|BeatsByDre|

Vì lý do xuất bản, tôi đã thực hiện một truy vấn để biến các bảng. Vì vậy, khi truy vấn Chọn được chạy, bảng trả về trông như sau

DeviceID|Accessories|Description|Specification|
     10 |earplugs   |protectors |BeatsByDre   |

Tôi đã tạo một giao diện người dùng để cho phép người dùng hệ thống cập nhật các trường khác nhau như Phụ kiện, Mô tả, Thông số kỹ thuật. Cập nhật hoạt động nếu tôi cập nhật tất cả các trường với truy vấn được hiển thị ở trên cùng. Tuy nhiên, khi tôi để trống một hộp văn bản, sau đó tôi gặp lỗi là @parameter bị thiếu một giá trị. Vì vậy, cố gắng tìm một giải pháp để chỉ cập nhật lĩnh vực mà một cái gì đó được viết. Vì vậy, nếu @parameter IS NULL thì hãy giữ giá trị ban đầu trong DB. Tôi đã tìm thấy một giải pháp khác thực sự gần với những gì tôi muốn nhưng không thể làm cho nó hoạt động được. Đây là giải pháp khác: /programming/9387839/mysql-if-not-null-then-display-1-else-display-0


Bạn có thể cung cấp lỗi chính xác này? Đây có phải là lỗi SQL-Server hay lỗi trong ứng dụng (UI) của bạn không? Có gì UPDATEtuyên bố không send UI cơ sở dữ liệu?
ypercubeᵀᴹ

Bạn có thể thêm nó trong câu hỏi? Nó có thể là với cách tuyên bố được xây dựng và những trích dẫn được sử dụng. Điều '@'Accessoriesđó không có ý nghĩa với tôi.
ypercubeᵀᴹ

1
Tôi nghĩ rằng mã UI của bạn có thể không tạo ra các báo cáo hợp lệ. Chỉ cho chúng tôi mã bạn có và tạo ra lỗi, không phải mã giả.
ypercubeᵀᴹ

Tôi muốn cảm ơn bạn yêu cầu sự giúp đỡ. Xin lỗi vì sự thiếu kinh nghiệm của tôi. Tôi quản lý để tìm lỗi và bạn đã đúng vấn đề ở cấp độ UI. Cảm ơn bạn rất nhiều vì sự giúp đỡ. Trong trường hợp ai đó đang tìm kiếm một câu trả lời tương tự, tôi đã sử dụng giải pháp đầu tiên
Greenhorn

Câu trả lời:


13

Tôi nghĩ rằng điều này sẽ giải quyết vấn đề:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN COALESCE(@Accessories, Details)
          WHEN 'Description'   THEN COALESCE(@Description, Details)
          WHEN 'Specification' THEN COALESCE(@Specification, Details)
          ELSE Details
              END
WHERE DeviceID = 10 ;

hoặc điều này (để tránh cập nhật dự phòng):

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN @Accessories
          WHEN 'Description'   THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
              END
WHERE DeviceID = 10 
  AND ( Name = 'Accessories'   AND @Accessories IS NOT NULL
     OR Name = 'Description'   AND @Description IS NOT NULL
     OR Name = 'Specification' AND @Specification IS NOT NULL
      ) ;

hoặc cái này, sử dụng hàm tạo giá trị bảng:

UPDATE da
SET da.Details = upd.Details
FROM DeviceAttribute AS da
  JOIN
    ( VALUES
      ('Accessories'   , @Accessories),
      ('Description'   , @Description),
      ('Specification' , @Specification)
    ) AS upd (Name, Details)
    ON upd.Name = da.Name 
WHERE da.DeviceID = 10
  AND upd.Details IS NOT NULL ;

Cảm ơn vì sớm phản hồi. Tôi sẽ thử nó và cho bạn biết kết quả.
Greenhorn

Bạn có nghĩa là giải pháp thứ 2 trong câu trả lời của tôi?
ypercubeᵀᴹ

vâng, tôi đang thử giải pháp thứ 3, tôi nêu lên các câu trả lời vì nó mang lại rất nhiều khả năng. Tôi buộc thứ 3 và nếu tôi làm cho nó hoạt động tôi cũng sẽ chấp nhận nó.
Greenhorn

Tất cả nên làm việc. Nếu họ không, bạn có thể chỉnh sửa câu hỏi của mình và thêm cấu trúc bảng (Tạo câu lệnh Bảng) và Quy trình được lưu trữ. Có thể có điều gì đó liên quan mà tôi hiểu lầm hoặc bạn đã không đề cập.
ypercubeᵀᴹ

Id các câu trả lời này hoạt động khi tất cả các tham số không phải là null nhưng không hoạt động khi một trong số chúng là null, sau đó xem mã UI và cách nó xử lý null khi tạo truy vấn. Và bạn có thể thêm mã (UI) đó vào câu hỏi.
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.