0

我一直在从事一项 SAS 工作,该工作从 SQL Server 中提取表,然后将该表加载到 Oracle 表中。

SQL Server 中的字段之一是 blob,它们可以大到 1G。当我在 oracle 表上运行此 blob 时收到长度警告,似乎已被截断,因此文件已损坏。

我已经看到 SAS 声明字符变量可以最大为 32K,但 SAS 也声明它可以访问高达 2G 的 blob。

我们怎样才能做到这一点?

proc sql;
create view work.W2K3NU8 as
  select
     ID,
     DNUMBER,
     FILENAME,
     FILE   
        format = $HEX2048.
        informat = $HEX2048.,
     (input(compress(DATEENTERED),YYMMDD10.)) as DATEENTERED length = 8
        format = date.
        informat = date.
        label = 'DATEENTERED',
     (input(compress(DATEADDED),YYMMDD10.)) as DATEADDED length = 8
        format = date.
        informat = date.
        label = 'DATEADDED',
     (input(compress(DATECHANGED),YYMMDD10.)) as DATECHANGED length = 8
        format = date.
        informat = date.
        label = 'DATECHANGED',
     TYPE
from &SYSLAST;
quit;

这是数据步骤

      data trd.GAFILES
          (dbnull = (
                     ID = NO
                     DNUMBER = YES
                     FILENAME = YES
                     GA_FILE = YES
                     DATEENTERED = YES
                     DATAADDED = YES
                     DATECHANGED = YES
                     TYPE = YES
                     ETL_CREATE = YES
                     ETL_UPDATE = YES));
     attrib ID length = $255
        format = $255.
        informat = $255.
        label = 'ID'; 
     attrib DNUMBER length = $10
        format = $10.
        informat = $10.
        label = 'DNUMBER'; 
     attrib FILENAME length = $255
        format = $255.
        informat = $255.
        label = 'FILENAME'; 
     attrib GA_FILE length = $4096
        format = $HEX2048.
        informat = $HEX2048.
        label = 'GA_FILE'; 
     attrib DATEENTERED length = 8
        format = DATETIME20.
        informat = DATETIME20.
        label = 'DATEENTERED'; 
     attrib DATAADDED length = 8
        format = DATETIME20.
        informat = DATETIME20.
        label = 'DATAADDED'; 
     attrib DATECHANGED length = 8
        format = DATETIME20.
        informat = DATETIME20.
        label = 'DATECHANGED'; 
     attrib TYPE length = $100
        format = $100.
        informat = $100.
        label = 'TYPE'; 
     attrib ETL_CREATE length = 8
        format = DATETIME20.
        informat = DATETIME20.
        label = 'ETL_CREATE'; 
     attrib ETL_UPDATE length = 8
        format = DATETIME20.
        informat = DATETIME20.
        label = 'ETL_UPDATE'; 
     call missing(of _all_);
     stop;
  run;
4

1 回答 1

2

SAS 数据集不支持 > 32767 个字符大小。我不确定您在哪里看到它支持更大;您可能正在阅读 ACCESS 参考,它描述了 DBMS 的不同数据类型(即,在 DB2 部分中,它将 BLOB 和 CLOB 描述为允许最大 2GB 大小,但这是描述 DB2 支持的内容 - 而不是 SAS 的支持)。

SAS 将愉快地访问BLOB,但它不会从中获取超过 32767。您必须分块阅读,或在传递会话中使用特定于 DBMS 的语言(必须在不触及它的情况下通过它)。您可以像这样读取块(填写适当的子字符串函数和连接信息):

proc sql;
connect to <>;
create table SASTBL as 
  select * from connection to <> (
   select substring_Function(blobfield,1,32767) as blob_1,
          substring_Function(blobfield,32768,32767) as blob_2,
          substring_Function(blobfield,65535,32767) as blob_3,
(... etc ... )
  from your_tbl;
);
quit;

如果您有 9.4,您还可以使用 FedSQL 进行转换;我对 FedSQL 不是很熟悉,但它的目的是支持比 SAS 支持的更多的数据类型。它没有明确说它可以支持 BLOB(关于 BLOB 的注释始终“映射到类似的数据类型”,这可能意味着 char 或 varchar),但如果你有 9.4,它可能值得一试。

于 2014-07-23T19:57:36.410 回答