JIKA TIDAK NULL maka PEMBARUAN lain menyimpan nilai bidang

10

Saya pikir saya entah bagaimana sudah dekat untuk membuatnya bekerja, tetapi untuk beberapa alasan saya masih mendapatkan kesalahan.

Saya memiliki permintaan UPDATE berikut:

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

Parameter diisi oleh pengguna yang berbeda. Masalah yang saya hadapi sekarang adalah bahwa bahkan ketika Anda ingin memperbarui satu bidang Anda masih harus mengisi dengan data lama parameter lainnya. Oleh karena itu saya ingin mengatur opsi JIKA @parameter IS NULL LALU menjaga nilai yang sudah disimpan dalam DB. Saya mencoba menemukan beberapa solusi dan sesuatu seperti kueri berikut tampaknya menjadi solusi tetapi saya tidak dapat membuatnya berfungsi:

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

THE DB disimpan dalam SQL Server 2008

Terima kasih sebelumnya atas bantuannya.

EDIT untuk mengklarifikasi:

Tabel aslinya terlihat seperti ini

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

Untuk alasan penerbitan, saya membuat kueri untuk membalik tabel. Jadi ketika kueri pemilihan dijalankan, tabel kembali terlihat seperti berikut ini

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

Saya membuat UI untuk memungkinkan pengguna sistem memperbarui bidang yang berbeda seperti Aksesori, Deskripsi, Spesifikasi. Pembaruan berfungsi jika saya memperbarui semua bidang dengan kueri yang ditunjukkan di atas. Namun ketika saya membiarkan kotak teks kosong, maka saya mendapatkan kesalahan bahwa @parameter kehilangan nilai. Jadi berusaha mencari solusi untuk memperbarui hanya bidang di mana ada sesuatu yang ditulis. Jadi jika @parameter IS NULL maka simpan nilai asli dalam DB. Saya menemukan solusi lain yang sangat dekat dengan apa yang saya inginkan tetapi tidak dapat membuatnya bekerja. Berikut adalah solusi lain: /programming/9387839/mysql-if-not-null-then-display-1-else-display-0

Orang yg masih hijau
sumber
Bisakah Anda memberikan kesalahan ini? Apakah ini kesalahan SQL-Server atau kesalahan dalam aplikasi (UI) Anda? Apa UPDATEpernyataan apakah kirim UI ke database?
ypercubeᵀᴹ
Bisakah Anda menambahkan itu dalam pertanyaan? Mungkin dengan bagaimana pernyataan itu disusun dan kutipan apa yang digunakan. Itu '@'Accessoriestidak masuk akal bagi saya.
ypercubeᵀᴹ
1
Saya pikir kode UI Anda mungkin tidak menghasilkan pernyataan yang valid. Tunjukkan kode yang Anda miliki dan hasilkan kesalahan, bukan kode semu.
ypercubeᵀᴹ
Saya ingin mengucapkan terima kasih kepada Agaim atas bantuannya. Maaf atas kurangnya pengalaman saya. Saya berhasil menemukan kesalahan, dan Anda benar masalahnya ada di level UI. Terima kasih banyak atas bantuannya. Jika seseorang mencari jawaban yang sama saya menggunakan solusi pertama
Greenhorn

Jawaban:

13

Saya pikir ini akan menyelesaikan masalah:

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 ;

atau ini (untuk menghindari pembaruan yang berlebihan):

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
      ) ;

atau ini, menggunakan konstruktor nilai tabel:

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 ;
ypercubeᵀᴹ
sumber
Terima kasih atas jawaban cepatnya. Saya akan mencobanya dan memberi tahu Anda hasilnya.
Greenhorn
Maksud Anda solusi kedua dalam jawaban saya?
ypercubeᵀᴹ
ya, saya mencoba solusi ke-3, saya menjawabnya karena memberikan banyak kemungkinan. Saya t 3 dan jika saya mulai bekerja saya akan menerimanya juga.
Greenhorn
Semua harus bekerja. Jika tidak, Anda dapat mengedit pertanyaan Anda dan menambahkan struktur tabel (Buat pernyataan Tabel) dan Prosedur Tersimpan. Mungkin ada sesuatu yang relevan yang saya salah pahami atau tidak Anda sebutkan.
ypercubeᵀᴹ
Id jawaban ini berfungsi ketika semua parameter tidak nol tetapi tidak berfungsi ketika salah satu dari mereka adalah nol, lalu lihat kode UI dan bagaimana ia menangani null saat membuat kueri. Dan Anda dapat menambahkan kode (UI) itu di pertanyaan.
ypercubeᵀᴹ