Wyobraź sobie stół z setką różnych kolumn. Wyobraź sobie, że mam tabelę danych użytkownika, z której chcę skopiować dane do tabeli podstawowej. Napisałem więc tę prostą instrukcję typu "wybierz-wybierz" i pojawia się ten błąd. Jaki jest najbardziej elegancki sposób, aby dowiedzieć się, która kolumna podnosi błąd?Jak ustalić, która kolumna podnosi błąd przepełnienia arytmetycznego po wstawieniu?
Moje pierwsze myśli na rozwiązania są o owijając go w transakcji, która będę ostatecznie wstecz oraz wykorzystać rodzaj dziel i rządź podejścia:
begin tran
insert into BaseTable (c1,c2,c3,...,cN)
select c1,c2,c3,...,cN
from UserTable
rollback tran
I to oczywiście nie. Więc dzielimy kolumnę na pół tak, jak to:
begin tran
insert into BaseTable (c1,c2,c3,...,cK) --where K = N/2
select c1,c2,c3,...,cK --where K = N/2
from UserTable
rollback tran
A jeśli się nie powiedzie, to w drugiej połowie kolumna z błędami. I kontynuujemy ten proces, dopóki nie znajdziemy brzydkiej kolumny.
Coś bardziej eleganckiego niż to?
Uwaga: Znalazłem również prawie duplikat tego pytania, ale ledwie odpowiada.
Jeśli możesz dopasować typy danych UserTable do tych z BaseTable, twój insert nie powinien mieć żadnego problemu. Wszystko, co jest potrzebne, po znalezieniu obraźliwej kolumny * UserTable *. –
@Lieven Cóż, UserTable jest po prostu ... tabelą użytkownika bez żadnych ograniczeń, ponieważ dane w niej zawarte pochodzą z Excela lub Accessa lub z innego. –
Współczuję. Jeśli jest to coś, co należy zrobić regularnie, czy nie mógłbyś stworzyć skryptu/procedury przechowywanej, która sprawdza twoje dane wejściowe? Makro i prosty wybór mogłyby przejść długą drogę, coś jak "SELECT" c1 ", CAST (c1) AS INTEGER z UserTable". –