Перемещение столбца TIMESTAMP из Oracle в SQL Server - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть БД Oracle с некоторыми данными, которые я хочу переместить на SQL Server.

Проблема состоит в том, что в моей БД Oracle есть некоторые столбцы с типом TIMESTAMP(0) WITH TIME ZONE, и SSIS обнаруживает их как CLOB,Поэтому он не может сказать, что не может преобразовать CLOB в datetime2.

. Я уже создал таблицы в базе данных SQL Server.Таким образом, он просто перемещает данные с помощью некоторого преобразования типов.

Я использую мастер импорта и экспорта SQL Server (SSIS) из SQL Server Management Studio (SSMS).

Яс помощью .NET Framework Data Provider для Oracle для подключения к базе данных Oracle и собственный клиент SQL Server 11.0 для подключения к моему SQL Server.

Мой тип источникаTIMESTAMP(0) WITH TIME ZONE и мой тип назначения datetime2.

Вот ошибка, которую я получаю:

[Source Information]
Source Location : localhost
Table: "MYSPACE"."MYTABLE"
Column: START_DATE
Column Type: CLOB
SSIS Type: Unicode text stream [DT_NTEXT]
Mapping file (to SSIS type): C:\Program Files (x86)\Microsoft SQL Server\140\DTS\MappingFiles\OracleClientToSSIS10.XML

[Destination Information]
Destination Location : localhost
Destination Provider : SQLNCLI11
Table: [dbo].[mytable]
Column: start_date
Column Type: datetime2
SSIS Type: database timestamp with precision [DT_DBTIMESTAMP2]
Mapping file (to SSIS type): C:\Program Files (x86)\Microsoft SQL Server\140\DTS\MappingFiles\MSSQLToSSIS10.XML

[Conversion Steps]
Conversion unknown ...
SSIS conversion file: C:\Program Files (x86)\Microsoft SQL Server\140\DTS\binn\DtwTypeConversion.xml

Итак, как вы можете видеть, столбец START_DATE определяется какCLOB.Это неверно.

Я заглянул внутрь OracleClientToSSIS10.XML

<!-- TIMESTAMP 10.* -->
<dtm:DataTypeMapping >
    <dtm:SourceDataType>
        <dtm:DataTypeName>timestamp</dtm:DataTypeName>
    </dtm:SourceDataType>
    <dtm:DestinationDataType>
        <dtm:NumericType>
            <dtm:DataTypeName>DT_DBTIMESTAMP2</dtm:DataTypeName>
            <dtm:SkipPrecision/>
            <dtm:UseSourceScale/>
        </dtm:NumericType>
    </dtm:DestinationDataType>
</dtm:DataTypeMapping>  

<!-- TIMESTAMP WITH TIME ZONE 10.* -->
<dtm:DataTypeMapping >
    <dtm:SourceDataType>
        <dtm:DataTypeName>TIMESTAMP WITH TIME ZONE</dtm:DataTypeName>
    </dtm:SourceDataType>
    <dtm:DestinationDataType>
        <dtm:NumericType>
            <dtm:DataTypeName>DT_DBTIMESTAMPOFFSET</dtm:DataTypeName>
            <dtm:SkipPrecision/>
            <dtm:UseSourceScale/>
        </dtm:NumericType>
    </dtm:DestinationDataType>
</dtm:DataTypeMapping>  

<!-- CLOB -->
<dtm:DataTypeMapping >
    <dtm:SourceDataType>
        <dtm:DataTypeName>CLOB</dtm:DataTypeName>
    </dtm:SourceDataType>
    <dtm:DestinationDataType>
        <dtm:CharacterStringType>
            <dtm:DataTypeName>DT_NTEXT</dtm:DataTypeName>
            <dtm:Length>255</dtm:Length>
        </dtm:CharacterStringType>
    </dtm:DestinationDataType>
</dtm:DataTypeMapping>

Кажется, хорошо, верно?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Я не смог заставить ни один из драйверов работать для столбцов даты.

Поэтому я в итоге зашел в SQL Developer и экспортировал таблицы со столбцом даты в операторы INSERT, а затем выполнил замену регулярного выражения для этого..

Веселые времена: (

0 голосов
/ 07 февраля 2019

У меня были похожие проблемы с форматированными в Oracle типами даты и даты.То, что я нашел, работает, чтобы преобразовать данные в строку на стороне Oracle, прежде чем натягивать их.Затем вы можете преобразовать данные, как только вы получите их на свой SQL Server.

Вы захотите изменить мастер импорта / экспорта, чтобы использовать запрос, чтобы указать данные для выборки с сервера Oracle.Как часть исходного запроса, вы можете выполнить преобразование следующим образом:

SELECT
CAST("START_DATE" AS VARCHAR2(26)) AS "StartDate"
FROM MYSPACE.MYTABLE

Затем в SQL Server вы можете преобразовать в дату и время, например:

SELECT CAST(CONVERT(DATETIMEOFFSET, StartDate) AS DATETIME)

Если выВ SQL Server 2016 или более поздней версии вы можете использовать AT TIME ZONE и местный часовой пояс, чтобы получить скорректированное значение даты и времени:

SELECT CAST(CONVERT(DATETIMEOFFSET, StartDate) AT TIME ZONE 'Pacific Standard Time' AS DATETIME)
...