Скопируйте таблицу из SQL Server в Oracle в SAS - имена столбцов слишком длинные в SQL Server - PullRequest
0 голосов
/ 08 января 2019

Мы пытаемся скопировать полную таблицу из базы данных SQL Server в Oracle в SAS EGuide, сохраняя имена столбцов. К сожалению, некоторые таблицы в SQL Server имеют имена столбцов длиннее, чем ограничение SAS в 32 символа.

Например, таблица «USR» в SQL Server имеет поле «Identity_Source_System_Modified_On», а SAS усекает столбец до «Identity_Source_System_Modified_». Метка столбца в SAS поддерживает полное имя.

Есть ли способ создать эту таблицу в Oracle, используя метку столбца, а не имя столбца? Или другой способ скопировать эту таблицу без усечения SAS имени столбца?

libname DEST oracle user=&user. pass = &pass. path = 'ORACLE100' 
schema=TESTSCHEMA buffsize = 25000;

proc sql;
connect to odbc (uid="&user." pwd="&passsql." dsn='goven');
create table User_Table as select * from connection to odbc
(
select * from dbo.USR  
);
disconnect from odbc;
quit ;

proc sql;
create table Dest.USR as
select 
*
from work.User_Table;
quit;

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Если вы используете Foundation SAS в качестве посредника для межсистемной копии, вы можете опубликовать копию подтверждения передачи с переименованием столбцов Oracle.

Я не вижу необходимости копировать таблицу SQL Server в работу SAS перед копированием в Oracle.

После копирования codegen alter table операторов, которые передаются в Oracle.

Proc SQL;
  * Use SAS as the conduit between the two database systems;

  create table dest.usr as select * from connection to odbc 
  (
    select * from dbo.usr
  );

  * Copy one row from SQL Server to see what the mediated column names were;

  create table one as select * from connection to odbc
  (
    select top 1 * from dbo.usr
  );

  * For the column names that dont match column labels code gen an alter statement;

  reset noprint;

  %let renames=;

  select 'alter table usr rename ' || trim(name) || ' to ' || trim(label) || ';' 
  into :renames
  separated by ' '
  from dictionary.columns
  where libname = 'WORK'
    and memname = 'ONE'
    and name ne label
  ;

  connect using dest;
  execute ( &renames ) by dest;
quit;      
0 голосов
/ 09 января 2019

SAS / Access всегда использует нижестоящее значение SAS, поэтому усечение всегда будет происходить, поскольку максимальная длина имени таблицы равна 32. Метки столбцов не усекаются, поскольку максимальная длина метки равна 256 (обычно метка - это имя таблицы СУБД).

Попробуйте использовать определение sqlserver libname и переместить данные с помощью proc fedsql.

 Libname sqlsrv sqlserver details

 proc fedsql;
    create table Dest.USR as
  select 
   *
 from sqlsrv.User_Table;
 quit;

PROC FedSQL может прийти на помощь, когда имеешь дело с проблемами с большей длиной столбца. Преимущество PROC FedSQL заключается в том, что при подключении к источнику данных он сопоставляет метаданные источника и цели соответственно и переводит в метаданные источника / цели без использования SAS / Access, поэтому усечение не происходит. Как oracle (источник) и sqlserver (цель) могут легко приспосабливать длину, поскольку текущая версия сервера sql и oracle поддерживают длину столбца 128.

У меня была похожая проблема, когда я перемещал данные из Hive в Teradata, и мне удалось исправить это с помощью proc fedsql и подробностей в одной из моих статей.

https://analytics.ncsu.edu/sesug/2017/SESUG2017_Paper-41_Final_PDF.pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...