Itgenase094: "The table can not be created" door itgenspr113 op SQL Server

Het probleem is verder geanalyseerd:

--
-- Op pgAdmin levert de volgende query enkele honderden rijen op ver in het verleden
-- (rond jaar 1) of in de toekomst (jaar 9000+).
--
select *
from   "fJournaalpost"
where  "documentDatum" > now()::date + interval '1 years'
       or
	   "documentDatum" < now()::date - interval '200 years'

Blijkbaar bevat metacom veel documentdatums in het verre verleden en verre toekomst. Als vervolgstap is geprobeerd deze data te verwerken en te kijken of een foutmelding optreedt:

--
-- Hiervoor maken we eerst een lege laadtabel met de juiste velden:
--
create or replace table mc_fjournaalpost@sql
as
select *
from   fJournaalpost@mc
where  false

--
-- Vervolgens probeer we rijen te laden.
--
begin
  for r
  in
  ( execute native 'select *'
    || 'from   "fJournaalpost"'
    || 'where  1=1'
    || 'and    "documentDatum" < now()::date - interval ''200 years'''
    datacontainer 'mc'
  )
  loop
    begin
      insert into mc_fjournaalpost@sql
      ( documentDatum
      )
      values
      ( r.documentDatum
      );
    exception
      when others
      then
        dbms_output.put_line('FAIL:' || to_char(r.documentDatum, 'YYYYMMDDHH24MISS'));
    end;
  end loop;
end;

Dit drukt enkele honderden rijen af in dbms_output. Uiteindelijk blijkt de foutmelding op te wekken met bijvoorbeeld:

insert into mc_fjournaalpost@sql
( documentDatum
)
values
( to_date('10220110000000', 'YYYYMMDDHH24MISS')
)

De foutmelding is dan:

itgenspr113: The row.
0 = 01-01-1753, 1 = 31-12-9999.

Ook de volgende statements leiden tot een foutmelding (merk op dat documentDatum een datetime2-kolom is):

set invantive-sql-correct-invalid-date@sql true;

insert into mc_fjournaalpost@sql
( documentDatum
)
values
( to_date('10220110', 'YYYYMMDD')
)

Door het vertalen van documentDatum buiten Gregoriaanse kalender naar 1-1-1753 werkt het zonder fouten:

begin
  for r
  in
  ( execute native 'select *'
    || 'from   "fJournaalpost"'
    || 'where  1=1'
    || 'and    "documentDatum" < now()::date - interval ''200 years'''
    datacontainer 'mc'
  )
  loop
    begin
      insert into mc_fjournaalpost@sql
      ( documentDatum
      )
      values
      ( case when r.documentDatum < to_date('17530101', 'YYYYMMDD') then to_date('17530101', 'YYYYMMDD') else r.documentDatum end
      );
    end;
  end loop;
end;

Oplossing is de kopieerquery te herformuleren als:

create or replace table mc_fjournaalpost@sql
as
select * except documentDatum
,      case
       when documentDatum < to_date('17530101', 'YYYYMMDD')
       then to_date('17530101', 'YYYYMMDD')
       else documentDatum
       end
       documentDatum
from   fJournaalpost@mc

De itgenspr113 is eigenlijk onterecht; datetime2 ondersteunt datums vanaf 1-1-0001.