簡體   English   中英

從SAS升級到SQL Server

[英]Upsert into SQL Server from SAS

我有一些數據集需要從SAS升級到SQL Server數據庫中(我的環境使用SAS DI 4.9)。

SAS DI附帶的默認表加載器轉換提供了一種Update / Insert加載樣式,並具有按SQL集,列或索引進行匹配的選項。 這些都不適合我,而是拋出錯誤

錯誤:CLI執行錯誤:[SAS] [ODBC SQL Server有線協議驅動程序] [Microsoft SQL Server]名稱為'SQL_CUR608F0C44282B0000'的游標不存在。

SAS注釋表明此問題可能與DataDirect驅動程序的版本有關,並且存在變通辦法,但是在我的環境中運行的SAS版本的變通辦法導致讀取性能不佳(這不能滿足我的需求)。 該環境由IT管理。

我想做的是利用SAS DI的自定義轉換功能來構建某種東西,使其工作方式與Table Loader轉換對我的設置用戶應具有的方式一樣。 這將需要一些使用更新+插入方法的 SQL傳遞,但是其中列和表的名稱是通過程序的輸入和輸出以編程方式確定的,而匹配列是由用戶指定的,與默認轉換相同。

這需要一些嚴肅的宏魔術。

這是我僅嘗試更新的部分(在[方括號]中帶有匿名信息):

%let conn = %str([my libname]); 
%let where_clause =  &match_col0 = &match_col0;

%macro custom_upsert;

  data _null_;
      put 'proc sql;';
      put 'connect to ODBC(&conn);';

      put "execute(update &_OUTPUT";
      %do i=1 %to &_OUTPUT_col_count;
          put '&&_OUTPUT_col_&i_name = &&_OUTPUT_col_&i_name';
      %end;
      put 'from &_OUTPUT join &_INPUT on';
      put 'where &where_clause';
      put ') by ODBC;';
      put 'quit;';
  run;
%mend;

%custom_upsert;

但這是由於不平衡引號和引用的字符串超過262個字符的錯誤而導致的。

我如何才能按預期工作?

編輯

這是我最終嘗試使用SAS代碼獲得的SQL Server代碼,主要區別在於SQL代碼引用了兩個SQL Server表,但實際上,我試圖從SAS表進行更新:

 begin
    update trgt_tbl
    set  col1 = col1
        , ...
        ,coln = coln
    from trgt_tbl
    join upd_tbl
    on trgt_tbl.match_col = upd_tbl.match_col;

    insert into trgt_tbl
    select * from
    (select 
      col1
     , ...
     ,coln
     from upd_tbl) as temp
    where not exists 
     (select 1 from trgt_tbl
      where match_col = temp.match_col);
end

宏可以直接生成SQL代碼,而不輸出所需的代碼進行記錄( put將這樣做)。 但是,您也可以put文件put將通過%include提交的文件。 由於單引號put ,文件中的代碼gen仍然具有宏分辨率引用( && )。 因此,要解析的那些宏變量必須在%include時在作用域中存在。

%macro myupsert;
  filename myupsert 'c:\temp\passthrough-upsert.sas';
  data _null_;
    file myupsert;
    …
    /* same puts */
    … 
  run;
  %include myupsert;
  filename myupsert;
%mend;

%myupsert;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM