首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将表从SQL Server复制到SAS中的Oracle - SQL Server中的列名太长

问将表从SQL Server复制到SAS中的Oracle - SQL Server中的列名太长
EN

Stack Overflow用户
提问于 2019-01-09 04:58:26
回答 2查看 517关注 0票数 1

我们正在尝试将一个完整的表从SQL Server数据库复制到SAS的EGuide中,同时保留列的名称。遗憾的是,SQL Server中某些表的列名长度超过了32个字符的SAS限制。

例如,SQL Server中的"USR“表有一个字段"Identity_Source_System_Modified_On”,而SAS会将该列截断为"Identity_Source_System_Modified_“。SAS中的列标签维护全名。

有没有一种方法可以在Oracle中使用列标签而不是列名来创建这个表?或者是复制这个表而不需要SAS截断列名的另一种方法?

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-09 05:12:03

SAS/Access始终使用SAS底层,因此,当表名的最大长度为32时,将始终发生截断。列标签不会被截断,因为标签的最大长度是256(通常标签是DBMS表名)。

尝试使用定义sqlserver libname并使用proc fedsql移动数据。

代码语言:javascript
复制
 Libname sqlsrv sqlserver details

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

在处理较长列长度的问题时,PROC FedSQL可以提供帮助。PROC FedSQL的优点是当连接到数据源时,它分别匹配数据源和目标的元数据,并转换为源/目标元数据,而不涉及so /Access,因此不会发生截断。因为oracle (源)和sqlserver(目标)都可以很容易地容纳长度,因为sql server的当前版本和oracle容纳的列长度都是128。

当我将数据从Hive移动到Teradata时,我遇到了类似的问题,并能够在我写的一篇论文中使用proc、fedsql和fulls详细信息进行修复。

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

票数 2
EN

Stack Overflow用户

发布于 2019-01-09 13:17:10

如果使用基础SAS作为系统间复制的中介,则可以通过对Oracle列进行重命名的post copy submit传递。

在复制到Oracle之前,我认为没有必要将SQL Server表复制到SAS work。

在复制提交给Oracle的代码生成alter table语句之后。

代码语言:javascript
复制
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;      
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54099588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档