2010-10-15 12 views
7

Mamy bazę danych z garstką szerokich tabel (po 40-80 kolumn) i właśnie znaleźliśmy błąd, który wprowadził wartości NULL do około 500 rekordów. Wartości NULL mogą pojawiać się w dowolnej z kolumn (wszystkie są kolumnami całkowitymi, patrz obrazek poniżej), ale te wartości NULL powodują problemy z jednym z naszych systemów raportowania, których nie można łatwo zmienić. Musimy zastąpić wartości NULL konkretną wartością statyczną (w tym przypadku 99), ale ponieważ ta zmiana musi być dokonywana na podstawie kolumny dla ponad 250 różnych kolumn, wolałbym nie pisać pojedynczych skryptów TSQL aktualizujących każdą kolumnę jeden o jeden.Zaktualizuj wszystkie wartości SQL NULL w wielu kolumnach, używając klauzuli WHERE na poziomie kolumny?

Mój mózg jest zbyt smażony, aby wymyślić sprytne rozwiązanie, więc moje pytanie brzmi: jak mogę wykonać to zadanie dla wszystkich kolumn na stole (lub lepiej jeszcze wiele tabel) za pomocą prostego i czytelnego zapytania SQL. Mogę wyizolować rekordy wystarczająco łatwo, używając łańcucha WHERE (Answer_1 IS NULL) OR (Answer_2 IS NULL) OR ... lub nawet numerów AdministrationID dla każdej tabeli, ale ta sztuczka nie zadziała podczas aktualizacji, ponieważ klauzula where nie dotyczy wiersza, a nie kolumny. Jakakolwiek rada?

Oto przykładowe zapytanie pokazując kilka zapisów z 4 różnych tabelach: Sample

+1

To boli, naprawdę źle. –

+0

Chyba powinienem dodać ograniczenie zerowe z domyślnym 99 na każdej kolumnie? – njzk2

+0

Patrzę na to i pytam siebie, dlaczego kolumny nie są następujące: AdministrationID, InstrumentID, AnswerID, wartość. Heck, możesz dodać jeszcze jeden identyfikator, aby móc scalić wszystkie te tabele w 1 ... –

Odpowiedz

21

nie ma żadnej konwencji do tego - jeśli chcesz tylko rekordy proces, w którym poszczególne kolumny NULL, ty trzeba użyć:

WHERE Answer_1 IS NULL 
    OR Answer_2 IS NULL 
    OR ... 

Ale można użyć tego w instrukcji UPDATE:

UPDATE YOUR_TABLE 
    SET col1 = COALESCE(col1, 99), 
     col2 = COALESCE(col2, 99), 
     col3 = ... 

LOGI c jest to, że wartość zostanie zaktualizowana do 99 tylko wtedy, gdy wartość kolumny jest równa NULL, z powodu działania COALESCE - zwracania pierwszej wartości innej niż NULL (przetwarzanie listy od lewej do prawej).

+0

+1 - muszę być zmęczony, próbowałem to zrobić za pomocą instrukcji "CASE" ... O_o – LittleBobbyTables

+0

+1 dla the Coalesce. –

+2

Po jasnej stronie kolumny są w formacie 'Answer_', więc Greg powinien być w stanie szybko skasować skrypty Excela. – LittleBobbyTables

3

Po prostu odpytuj tabelę sys.columns dla każdej tabeli i utwórz trochę dynamicznego sql ... To brutalna siła, ale oszczędza ci to, że musisz napisać wszystkie t-sql.

Na przykład:

DECLARE @TABLENAME AS VARCHAR(255) 

SET @TABLENAME = 'ReplaceWithYourTableName' 

SELECT 'UPDATE ' + @TableName + ' SET ' + CAST(Name AS VARCHAR(255)) + ' = 99 
WHERE ' + CAST(Name AS VARCHAR(255)) + ' IS NULL' 
FROM sys.columns 
WHERE object_id = OBJECT_ID(@TABLENAME) 
    AND system_type_id = 56 -- int's only 
+0

Częściowo zgadzam się z Ashish Patel na ISNULL.Powinieneś wyczyścić dane dla swojego środowiska raportowania i podać niezbędne ustawienia domyślne, aby uprościć raportowanie IMO sql. Myślę, że ISNULL to funkcja skalarna do rozruchu, która jest równie zła pod względem wydajności (nie mogę potwierdzić tego założenia poprzez wyszukiwania w Google :)) Jeśli kolumny nie powinny mieć wartości NULL, to być może schemat powinien należy zmienić, aby nie zezwalać na pobieranie wartości NULL lub wartości domyślnej na poziomie bazy danych. Ponownie, wykracza to poza zakres pytania i prawdopodobnie sprowadza się do standardów kodowania sklepów. –

4

Ponieważ trzeba to zrobić w każdym miejscu napisałem niektóre javascript, aby pomóc budować sql. wytnij i wklej to w pasku adresu przeglądarki, aby uzyskać twój sql.

javascript:sql='update your table set ';x=0;while(x <= 40){sql += 'answer_'+x+ ' = coalesce(answer_'+x+',99),\n';x++;};alert(sql); 
2

Nie podoba mi się pomysł manipulowania danymi w celach raportowania. Jeśli zmienisz wartości NULL na 99, aby ułatwić raportowanie, uważam te dane za uszkodzone. Co się stanie, jeśli poza raportowaniem będą istnieć inni konsumenci, którzy potrzebują prawdziwych danych?

Wolę napisać inteligentne zapytanie o raport. Na przykład, jeśli użyjesz ISNULL (columnname, 99), zwróci 99, gdy wartość kolumny będzie równa NULL.

+1

Zwykle się zgadzam, ale w tym przypadku wartości NULL zostały dodane przez pomyłkę, zamiast używać poprawnej wartości 99. Zmiana zapytania raportowania nie jest opcją, ponieważ jest to zastrzeżony system raportowania. –

Powiązane problemy