【问题标题】:Character length in data step versus proc sql数据步中的字符长度与 proc sql
【发布时间】:2016-03-28 18:42:55
【问题描述】:

是否有可能使用 SAS proc sql 创建表会截断 255 个字符的字符变量?跟库引擎类型有关系吗?

我正在使用这样的 PCFILES 库名(注意 dbmax_text 选项):

libname mylib PCFILES PATH = "C:\path\to\my\32bit\MS Acccess.ACCDB" dbmax_text=4000;

然后我做一个这样的proc sql:

proc sql noprint;
   create table work.cbdata as
    select 
        distinct var1,
        var2,
        ...
    from mylib.var2015
    where 
        upcase(var1) = "DIQ" 
    order by var1
  ;
quit;

var2 在 255 处被截断,即使它的格式在列属性视图中列为 $4000.。当我将其作为数据步骤执行时,所有字符数据都通过:

data vardb;
  set mylib.var2015;
  if var1 = "DIQ";
run;

我的宏库中嵌入了 40-50 个这样的 sql 过程,因此我不希望重构所有宏以使用数据步骤(如果可能的话)。有人知道吗

a) 如果 proc sql 中有一些选项可以使其尊重 dbmax_text。

或

b) 有关 SAS 如何处理 proc sql 的 create table 语句中的字符长度的任何文档?

编辑 - 添加一些屏幕截图。

SAS 认为变量长度为 4000 个字符:

【问题讨论】:

  • FORMAT 和变量 LENGTH 没有定义相同的属性,尽管一个可以暗示另一个。
  • @data_null_ 是的。我知道这一切。这是另一回事。长度和格式都说 4000,但字符串本身以 255 结尾。如果有帮助,我可以做一些屏幕抓取?
  • 做一个测试,你使用 data var2015 将数据读入 sas 数据集;设置 mylib.var2015;跑;看看这是否给出了你认为应该的 VAR2。
  • 是的。数据步骤提供超过 255 个字符的变量。
  • 在您的选择子句中,您可以尝试var2 length=4000, 而不是var2,,看看是否有帮助?

标签: sql sas create-table datastep


【解决方案1】:

罪魁祸首是distinct 子句。如果您删除它,列将保持其长度,然后您可以根据需要使用 proc 排序消除重复项。

【讨论】:

  • 哇。请告诉我这种奇怪现象只发生在 PCFILES 引擎上(从 M$ 文件中读取的惩罚?)。有人将此作为错误报告给 SAS 技术支持吗?
  • 我不知道。这可能是多种因素的组合。我肯定会鼓励 OP 提交错误报告。
猜你喜欢
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2011-01-20
相关资源
最近更新 更多