Saya ingin memperbarui CODE_DEST kolom saya dengan nomor tambahan. Saya sudah:
CODE_DEST RS_NOM
null qsdf
null sdfqsdfqsdf
null qsdfqsdf
Saya ingin memperbaruinya menjadi:
CODE_DEST RS_NOM
1 qsdf
2 sdfqsdfqsdf
3 qsdfqsdf
Saya sudah mencoba kode ini:
UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId
FROM (SELECT Row_Number() OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)
Ini tidak berfungsi karena )
Saya juga telah mencoba:
WITH DESTINATAIRE_TEMP AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY [RS_NOM] DESC) AS RN
FROM DESTINATAIRE_TEMP
)
UPDATE DESTINATAIRE_TEMP SET CODE_DEST=RN
Tetapi ini juga tidak berhasil karena persatuan.
Bagaimana cara memperbarui kolom menggunakan ROW_NUMBER()
fungsi di SQL Server 2008 R2?
sql-server
sql-server-2008-r2
sql-update
pengguna609511
sumber
sumber
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
Jawaban:
Satu opsi lagi
sumber
coba ini
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
sumber
SET CODE_DEST = @id, @id = @id + 1
agar mudah dibaca.sumber
Upaya kedua Anda gagal terutama karena Anda menamai CTE sama dengan tabel yang mendasarinya dan membuat CTE terlihat seperti CTE rekursif , karena pada dasarnya ia mereferensikan dirinya sendiri. Sebuah CTE rekursif harus memiliki struktur khusus yang mengharuskan penggunaan
UNION ALL
operator yang ditetapkan.Sebagai gantinya, Anda bisa saja memberi CTE nama yang berbeda serta menambahkan kolom target padanya:
sumber
Ini adalah versi modifikasi dari jawaban @Aleksandr Fedorenko yang menambahkan klausa WHERE:
Dengan menambahkan klausa WHERE saya menemukan kinerja meningkat secara besar-besaran untuk pembaruan selanjutnya. Server Sql tampaknya memperbarui baris tersebut meskipun nilainya sudah ada dan perlu waktu untuk melakukannya, jadi menambahkan klausa where membuatnya hanya melewati baris yang nilainya tidak berubah. Saya harus mengatakan saya heran seberapa cepat bisa menjalankan kueri saya.
Penafian: Saya bukan ahli DB, dan saya menggunakan PARTITION BY untuk klausa saya, jadi mungkin hasilnya tidak sama persis untuk kueri ini. Bagi saya kolom yang dimaksud adalah pesanan berbayar pelanggan, jadi nilainya biasanya tidak berubah setelah ditetapkan.
Juga pastikan Anda memiliki indeks, terutama jika Anda memiliki klausa WHERE pada pernyataan SELECT. Indeks yang difilter bekerja sangat baik untuk saya karena saya memfilter berdasarkan status pembayaran.
Kueri saya menggunakan PARTITION oleh
Bagian 'IS NOT NULL' tidak diperlukan jika kolom tidak dapat dinihilkan.
Ketika saya mengatakan peningkatan kinerja sangat besar yang saya maksud itu pada dasarnya instan ketika memperbarui sejumlah kecil baris. Dengan indeks yang tepat, saya dapat mencapai pembaruan yang membutuhkan waktu yang sama seperti kueri 'dalam' dengan sendirinya:
sumber
Saya melakukan ini untuk situasi saya dan bekerja
sumber
Cara sederhana dan mudah untuk memperbarui kursor
sumber
Jika tabel tidak memiliki relasi, cukup salin semua di tabel baru dengan nomor baris dan hapus yang lama dan ganti nama yang baru dengan yang lama.
sumber