Stellen Sie sich eine Tabelle mit hundert verschiedenen Spalten vor. Stellen Sie sich vor, dass ich eine Benutzerdatentabelle habe, von der ich Daten in die Basistabelle kopieren möchte. Also habe ich diese einfache insert-select-Anweisung geschrieben und dieser Fehler taucht auf. Also, was ist der eleganteste Weg herauszufinden, welche Spalte den Fehler verursacht?Wie kann man herausfinden, welche Spalte beim Einfügen einen arithmetischen Überlauffehler verursacht?
Meine ersten Gedanken über die Lösung sind darüber in einer Transaktion Umwickeln, die ich letztlich eine Art Wasserscheide Rollback und verwenden und Conquer Ansatz:
begin tran
insert into BaseTable (c1,c2,c3,...,cN)
select c1,c2,c3,...,cN
from UserTable
rollback tran
Und dies nicht offensichtlich. So teilen wir die Säule in der Mitte gesetzt wie so:
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
Und wenn es scheitert dann die fehlerhaften Spalt in der anderen Hälfte. Und wir setzen den Prozess fort, bis wir die lästige Säule finden.
Etwas eleganter als das?
Hinweis: Ich fand auch ein Beinahe-Duplikat dieser Frage, aber es beantwortet es kaum.
Wenn Sie die Datentypen von UserTable mit denen von BaseTable übereinstimmen, sollte Ihr Einfügen kein Problem haben. Alles was danach benötigt wird, ist das Finden der anstößigen * UserTable * Spalte. –
@Lieven Nun, UserTable ist nur das ... eine Benutzertabelle ohne Einschränkungen, weil die Daten darin von Excel oder Access oder whatnot sind. –
Ich sympathisiere. Wenn dies regelmäßig erledigt werden muss, könnten Sie nicht ein Skript/eine gespeicherte Prozedur erstellen, die Ihre Eingaben überprüft? Ein Makro und eine einfache Auswahl würden sehr weit gehen, etwa "SELECT" c1 ', CAST (c1) AS INTEGER FROM UserTable'. –