我们正在尝试将一个完整的表从SQL Server数据库复制到SAS的EGuide中,同时保留列的名称。遗憾的是,SQL Server中某些表的列名长度超过了32个字符的SAS限制。
例如,SQL Server中的"USR“表有一个字段"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;发布于 2019-01-09 05:12:03
SAS/Access始终使用SAS底层,因此,当表名的最大长度为32时,将始终发生截断。列标签不会被截断,因为标签的最大长度是256(通常标签是DBMS表名)。
尝试使用定义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的优点是当连接到数据源时,它分别匹配数据源和目标的元数据,并转换为源/目标元数据,而不涉及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
发布于 2019-01-09 13:17:10
如果使用基础SAS作为系统间复制的中介,则可以通过对Oracle列进行重命名的post copy submit传递。
在复制到Oracle之前,我认为没有必要将SQL Server表复制到SAS work。
在复制提交给Oracle的代码生成alter table语句之后。
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; https://stackoverflow.com/questions/54099588
复制相似问题