/ / Das Ändern des Datentyps von DateTime in Time in DB2 führt zu Fehlern - SQL, DB2

Das Ändern des Datentyps von DateTime in Time in DB2 führt zu error-sql, db2

Folgende SQL wird erfolgreich in der Entwicklungsdatenbank ausgeführt.

SQL dient zum Ändern des Datentyps von DATETIME zu TIME

ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT ALTER COLUMN FROM_DT SET DATA TYPE TIME;

In der Deployment-Datenbank gibt es jedoch Fehler

Fehler beim Vorbereiten 42601 (-104) [IBM] [CLI-Treiber] [DB2 / NT] SQL0104N Ein unerwarteter Token "TIME" wurde nach "ROM_DT SET DATA TYPE" gefunden. Erwartete Token können Folgendes enthalten: "". SQLSTATE = 42601

Antworten:

0 für die Antwort № 1

Vielleicht liegt es an der Versionsänderung von DB2

Ich habe versucht, mit folgenden Abfragen den Datentyp zu ändern DATETIME zu TIME

ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT ADD COLUMN TempFromTime TIME ;

CALL SYSPROC.ADMIN_CMD ("reorg table SCHEDULER.MV_SCHDL_APPOINTMENT");

UPDATE SCHEDULER.MV_SCHDL_APPOINTMENT SET TempFromTime =CAST(FROM_DT AS TIME);
ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT DROP COLUMN FROM_DT;

ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT ADD COLUMN FROM_DT TIME ;

CALL SYSPROC.ADMIN_CMD ("reorg table SCHEDULER.MV_SCHDL_APPOINTMENT");

UPDATE SCHEDULER.MV_SCHDL_APPOINTMENT SET FROM_DT=TempFromTime ;

ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT DROP COLUMN TempFromTime;

CALL SYSPROC.ADMIN_CMD ("reorg table SCHEDULER.MV_SCHDL_APPOINTMENT");

Schritte:

  1. Temporäre Spalte erstellen
  2. Daten in temporäre Spalte mit aktualisierten Daten aus der gewünschten Spalte kopieren.
  3. Vorhandene Spalte löschen
  4. Fügen Sie eine neue Spalte mit Design-Datentyp und -namen hinzu.
  5. Aktualisieren Sie neue Spaltendaten mit einer temporären Spalte
  6. Temporäre Spalte löschen

Wenn Sie die Spalte per Abfrage umbenennen können, benennen Sie die temporäre Spalte um und können die Schritte 4,5 und 6 überspringen.

Die folgende Abfrage kann zum Umbenennen der Spalte verwendet werden.

ALTER TABLE SCHEDULER.MV_SCHDL_APPOINTMENT CHANGE TempFromTime FROM_DT TIME;

Es erledigt meine Aufgabe.

Ich finde immer noch die bessere Lösung. Diese Lösung funktioniert auch für mich.