Chcę zaktualizować moją kolumnę CODE_DEST o kolejny numer. Mam:
CODE_DEST RS_NOM
null qsdf
null sdfqsdfqsdf
null qsdfqsdf
Chciałbym go zaktualizować, aby był:
CODE_DEST RS_NOM
1 qsdf
2 sdfqsdfqsdf
3 qsdfqsdf
Wypróbowałem ten kod:
UPDATE DESTINATAIRE_TEMP
SET CODE_DEST = TheId
FROM (SELECT Row_Number() OVER (ORDER BY [RS_NOM]) AS TheId FROM DESTINATAIRE_TEMP)
To nie działa, ponieważ )
Próbowałem też:
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
Ale to również nie działa z powodu związku.
Jak zaktualizować kolumnę za pomocą ROW_NUMBER()
funkcji w programie SQL Server 2008 R2?
sql-server
sql-server-2008-r2
sql-update
user609511
źródło
źródło
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID
Odpowiedzi:
Jeszcze jedna opcja
źródło
Spróbuj tego
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
źródło
SET CODE_DEST = @id, @id = @id + 1
dla czytelności.źródło
Twoja druga próba nie powiodła się głównie dlatego, że nazwałeś CTE taką samą jak podstawowa tabela i sprawiłeś, że CTE wyglądało tak, jakby było rekurencyjnym CTE , ponieważ zasadniczo odwoływało się do siebie. Rekurencyjne CTE musi mieć specyficzną strukturę, która wymaga używania
UNION ALL
operatora zadanej.Zamiast tego możesz po prostu nadać CTE inną nazwę, a także dodać do niej kolumnę docelową:
źródło
To jest zmodyfikowana wersja odpowiedzi @Aleksandr Fedorenko dodająca klauzulę WHERE:
Dodając klauzulę WHERE zauważyłem, że wydajność znacznie się poprawiła w przypadku kolejnych aktualizacji. Wydaje się, że serwer Sql aktualizuje wiersz, nawet jeśli wartość już istnieje i zajmuje to trochę czasu, więc dodanie klauzuli where powoduje, że po prostu pomija wiersze, w których wartość nie uległa zmianie. Muszę powiedzieć, że byłem zdumiony, jak szybko może wykonać moje zapytanie.
Zastrzeżenie: nie jestem ekspertem od DB i używam PARTITION BY dla mojej klauzuli, więc może to nie być dokładnie takie same wyniki dla tego zapytania. Dla mnie ta kolumna to płatne zamówienie klienta, więc wartość generalnie nie zmienia się po jej ustawieniu.
Upewnij się również, że masz indeksy, zwłaszcza jeśli masz klauzulę WHERE w instrukcji SELECT. Filtrowany indeks działał świetnie, ponieważ filtrowałem na podstawie statusów płatności.
Moje zapytanie przy użyciu PARTITION wg
Część „NIE JEST NULL” nie jest wymagana, jeśli kolumna nie dopuszcza wartości null.
Kiedy mówię, że wzrost wydajności był ogromny, mam na myśli to, że był on zasadniczo natychmiastowy podczas aktualizowania niewielkiej liczby wierszy. Dzięki odpowiednim indeksom udało mi się uzyskać aktualizację, która zajęła tyle samo czasu, co samo zapytanie „wewnętrzne”:
źródło
Zrobiłem to dla mojej sytuacji i pracowałem
źródło
Prosty i łatwy sposób na aktualizację kursora
źródło
Jeśli tabela nie ma relacji, po prostu skopiuj wszystko do nowej tabeli z numerem wiersza i usuń starą i zmień nazwę nowej na starą.
źródło