Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SAS日期写入SQL Server数据库_Sql_Database_Sas - Fatal编程技术网

将SAS日期写入SQL Server数据库

将SAS日期写入SQL Server数据库,sql,database,sas,Sql,Database,Sas,如何将SAS日期写入数据库中的Microsoft SQL Server 2016Date数据类型 我得到的SAS数据带有SAS日期DataEndDay,我想将其写入数据库。正在使用以下位(缓冲区只是为了加速测试失败): 如果尝试写入其中任何一个,则会出现转换错误: 错误:ICommand::执行失败:从字符串转换日期和/或时间时,转换失败 当我选择字符串时,它看起来非常正常: proc sql; select DataEndDay1 from SAS_data_to_publish; quit;

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

我得到的SAS数据带有SAS日期
DataEndDay
,我想将其写入数据库。正在使用以下位(缓冲区只是为了加速测试失败):

如果尝试写入其中任何一个,则会出现转换错误:

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

当我选择字符串时,它看起来非常正常:

proc sql; select DataEndDay1 from SAS_data_to_publish; quit;
“2018-12-12”

之前,我用类似的技巧编写了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;
数据\u空\u;
将SAS_数据_设置为_发布;
调用symput('foobar',quote(put(DataEndDay,yymmdddd10.-L),“”);
跑
....
挑选
,
、&foobar。
从work.SAS_data_到发布
;退出
当然,如果
DataEndDay
发生变化,这将立即失败,但可能表明
procsql
s select子句中的某些内容已关闭


编辑编辑将问题粘贴到

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

proc append base=valu.Data_upload_from_me force
   data=work.SAS_data_to_publish 
;
run;
确保SAS数据集中的日期变量使用与目标数据库表中相应变量名称相同的数据类型。因此,如果MS SQL数据库使用时间戳字段作为日期值,那么请确保SAS数据集使用日期时间值

如果要使用常量,请确保在SAS代码中使用SAS语法,在任何传递代码中使用MS SQL语法

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;

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

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;

SAS实际上不支持SQL server日期数据类型。我想这是因为它较新,但无论出于什么原因,都必须以字符串形式传递数据

对于缺少的值,重要的是使用空白字符串,而不是
字符。这里最简单的解决方法是设置:

options missing=' ';

这将允许您正确插入数据。如果愿意,您可以将其返回到
。在一个可能被其他人使用的生产应用程序中,我会考虑暂时搁置选项值,然后重置为该值,以免造成危害。节省了大量的文字和优雅。很遗憾,我仍然收到“类型不匹配”错误:(我将尝试向SAS论坛询问此问题。我不是唯一一个有此问题的人。不幸的是,这不适用于SQL Server数据类型“DATE”。这可能与分配给您尝试写入的变量的格式有关。特别是当您显式使用
put
语句格式化要写入的值时,它工作得很好。Proc SQL习惯在处理值之前将格式应用于值(如将值保存到宏变量)。当日期变量失败时,为其分配了什么格式?如果将其更改为
yymmdd10.
格式,然后尝试运行插入代码,会发生什么情况?@RobertPenridge尝试更改格式,但没有效果。甚至在select子句中:
select…DataEndDay format=yymmdd10.informat=yymdd10.,
没有我开始认为这可能是一个真正的bug.Thx。这是一个更优雅的解决方案。
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;
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;
options missing=' ';