Запись дат SAS в базу данных SQL Server - PullRequest
0 голосов
/ 14 декабря 2018

Как записать даты 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;

Но если я преобразую дату SAS в строку в шагах данных SAS:

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

и попытаюсь написать любой из них,Я получаю ошибку преобразования:

ОШИБКА: 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;

Конечно, это немедленно завершится неудачей, если DataEndDay изменится, но, возможно, демонстрирует, что что-то не так в Proc SQL s предложении выбора ....

Редактировать Редактировать Вставил вопрос в SAS форумы

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Мне наконец удалось взломать проблему.Проблема была в пропущенных значениях.Поскольку я передаю значения в виде строк в базу данных, анализатор интерпретирует пропущенные значения как реальные точки вместо пустых строк.Следующие работы:

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;
0 голосов
/ 14 декабря 2018

Обычно я просто использую PROC APPEND для вставки наблюдений в удаленную базу данных.

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

Убедитесь, что ваша переменная даты в вашем наборе данных SAS использует тот же тип данных, что и соответствующие имена переменных в вашей целевой таблице базы данных,Поэтому, если ваша база данных MS SQL использует поля TIMESTAMP для значений даты, убедитесь, что ваш набор данных SAS использует значения DATETIME.

Если вы хотите использовать константы, обязательно используйте синтаксис 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...