[英]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.