代码之家  ›  专栏  ›  技术社区  ›  pinegulf

将SAS日期写入SQL Server数据库

  •  0
  • pinegulf  · 技术社区  · 7 年前

    如何将SAS日期写入Microsoft SQL Server 2016 Date 数据库中的数据类型?

    我有SAS数据和SAS日期 DataEndDay 我想把它写进数据库。正在使用以下位(缓冲区只是为了加速测试失败):

    libname valu oledb provider=sqloledb schema="dbo" INSERTBUFF=100
            properties=("User ID"="&username." Password="&pw."
                        "data source" = &database. 
                        "initial catalog"=&catalog.);
    
    proc sql noprint;
     insert into valu.Data_upload_from_me
    (   <some_columns...>, 
       <more-columns...>
    ,DataEndDay
    )
    
    select 
    <some_columns_source...>,
    <more-columns_source...>
    ,DataEndDay 
    from work.SAS_data_to_publish 
    ;quit;
    

    当然,因为SAS的日期是数字,直接写是失败的。如果我将其硬编码为:

    select 
    <some_columns_source...>,
    <more-columns_source...>
    ,'2018-12-12' 
    from work.SAS_data_to_publish 
    ;quit;
    

    data SAS_data_to_publish ; 
        set SAS_data_to_publish ;
         dataEndday0 = put(DataEndDay, yymmddd10.);
         DataEndDay1 = quote(dataEndday0, "'") ;
    run;
    

    试着写一个,我得到转换错误:

    错误:ICommand::Execute失败。:从字符串转换日期和/或时间时,转换失败。

    当我选择字符串时,它看起来很好:

    proc sql; select DataEndDay1 from SAS_data_to_publish; quit;
    

    我以前写过dateTimes

    proc format;
        picture sjm
        . = .
        other='%Y-%0m-%0d %0H:%0M:%0S:000' (datatype=datetime)
    ;run;
    
    data to_be_written; 
        set save.raw_data_to_be_written;
        DataEndDay0 = put(dhms(DataEndDay,0,0,0), sjm. -L);
    run;
    

    有人遇到过类似的问题吗?我怎么写日期? 我可以让他们把专栏改成dateTime,也许。。。。

    我设法找到了一个解决办法,但很难看,坦白说,我不喜欢。碰巧我的日期对于所有行都是相同的,所以我可以将它赋给宏变量,然后在数据库编写中使用它。

    data _NULL_; 
      set SAS_data_to_publish; 
      call symput('foobar', quote( put (DataEndDay , yymmddd10. -L), "'") ) ; 
    run;
    
    ....
    select 
      <some_columns_source...>,
      <more-columns_source...>
     ,&foobar.
    from work.SAS_data_to_publish 
    ;quit;
    

    当然这会立即失败 数据结束日 变化,但可能表明有东西不对劲 Proc SQL 选择子句。。。。

    SAS forums

    1 回复  |  直到 7 年前
        1
  •  1
  •   pinegulf    7 年前

    我终于设法解决了这个问题。问题是缺少的值。当我将值作为字符串传递到数据库时,解析器将丢失的值解释为实点而不是空字符串。以下工作:

    data upload; 
      set upload; 
      CreatedReportdate2 = PUT(CreatedReportdate , yymmddn8.);
    run;
    
    libname uplad_db odbc  noprompt = 
            "DRIVER=SQL Server;  server=&server.; Uid=&user.;Pwd=&pw.; DATABASE=&db.;" 
            INSERTBUFF=32767;
    
    proc sql; 
      insert into uplad_db.upload_table 
      (.... ) 
     select 
      case when CreatedReportdate2 ='.'  then '' else CreatedReportdate2 end, 
      ... 
     from upload; 
    quit;
    
        2
  •  1
  •   Joe    6 年前

    SAS并不真正正确地支持SQL server日期数据类型。我想这是因为它更新了,但是不管出于什么原因,你必须将数据作为字符串传递。

    对于缺少的值,重要的是要有一个空字符串,而不是 .

    options missing=' ';
    

    这将允许您正确地插入数据。然后你可以把它还给 .

        3
  •  0
  •   Tom    7 年前

    通常我只使用PROC APPEND将观察结果插入远程数据库。

    proc append base=valu.Data_upload_from_me force
       data=work.SAS_data_to_publish 
    ;
    run;
    

    确保SAS数据集中的日期变量使用与目标数据库表中相应变量名相同的数据类型。因此,如果您的mssql数据库使用时间戳字段作为日期值,那么请确保您的SAS数据集使用日期时间值。

    data test;
       date = '01JAN2017'd ;
       datetime = '01JAN2017:00:00'dt ;
    run;
    
    proc sql ;
      connect to oledb .... ;
      execute (  ... date = '2017-01-01' .... datetime='2017-01-01 00:00' ...)
      by oledb;
    quit;
    
    推荐文章