Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
Sql server 从SAS向上插入SQL Server_Sql Server_Sas_Sas Macro_Sas Dis - Fatal编程技术网

Sql server 从SAS向上插入SQL Server

Sql server 从SAS向上插入SQL Server,sql-server,sas,sas-macro,sas-dis,Sql Server,Sas,Sas Macro,Sas Dis,我有几个数据集需要从SAS升级到SQL server数据库中(我的环境使用SAS DI 4.9) 随SAS DI打包的默认表加载器转换提供了更新/插入加载样式,并具有按SQL集、列或索引匹配的选项。这些都不适合我,而是抛出了错误 错误:CLI执行错误:[SAS][ODBC SQL Server Wire Protocol driver][Microsoft SQL Server]带有名称的光标 “SQL\U CUR608F0C44282B0000”不存在 这表明此问题可能与DataDirect驱

我有几个数据集需要从SAS升级到SQL server数据库中(我的环境使用SAS DI 4.9)

随SAS DI打包的默认表加载器转换提供了更新/插入加载样式,并具有按SQL集、列或索引匹配的选项。这些都不适合我,而是抛出了错误

错误:CLI执行错误:[SAS][ODBC SQL Server Wire Protocol driver][Microsoft SQL Server]带有名称的光标 “SQL\U CUR608F0C44282B0000”不存在

这表明此问题可能与DataDirect驱动程序的版本有关,并且存在解决方法,但在我的环境中运行的SAS版本的解决方法会导致读取性能差(这对于我的需要是不可接受的)。环境由IT管理

我想做的是利用sasdi的自定义转换功能来构建一些工作方式,就像我的设置中的表加载器转换应该为用户提供的那样。这将需要一些SQL传递,其中使用,但列和表名是通过编程方式从转换的输入和输出中确定的,匹配列是由用户指定的,与默认转换相同

这需要一些严肃的宏观魔术

以下是我为更新部分所做的尝试(匿名信息在[方括号]中):

但这是失败的,错误是不平衡的引号和引用的字符串超过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
完成)。但是,您也可以
放入将通过
%include
提交的文件中。由于单引号
put
,文件中的代码生成器仍然具有宏分辨率引用(
&&&
)。因此,要解析的宏变量必须在
%include
时间存在于作用域中

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

%myupsert;

宏可以直接生成SQL代码,而不是将所需的代码输出到日志(这将
put
完成)。但是,您也可以
放入将通过
%include
提交的文件中。由于单引号
put
,文件中的代码生成器仍然具有宏分辨率引用(
&&&
)。因此,要解析的宏变量必须在
%include
时间存在于作用域中

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

%myupsert;

您正在尝试使用宏生成代码还是运行代码?因为您当前形式的代码只是将PROC-SQL代码写入日志文件。嘿@PythonRSAS,我尝试分步骤构建代码:步骤1只是为更新部分生成代码,以便检查并确保代码正确生成。第2步是为插入部分添加代码,然后第3步是执行代码。然而,我在第一步就被卡住了!好的,我明白了。您可以发布宏生成的您试图运行的完整输出吗。如果没有各种宏变量的值,很难说出您提到的错误来自何处,因为您似乎在使用PUT语句生成代码,为什么不使用数据集而不是宏变量来驱动流程。这应该比宏代码更容易调试。生成代码文件后,使用
%include
执行它。问题是如何生成所显示的语法?或者如何执行您显示的语法?如果是前者,则显示需要更改的信息来源。如果是后者,则显示您已尝试的内容。您是尝试生成代码还是使用宏运行代码?因为您当前形式的代码只是将PROC-SQL代码写入日志文件。嘿@PythonRSAS,我尝试分步骤构建代码:步骤1只是为更新部分生成代码,以便检查并确保代码正确生成。第2步是为插入部分添加代码,然后第3步是执行代码。然而,我在第一步就被卡住了!好的,我明白了。您可以发布宏生成的您试图运行的完整输出吗。如果没有各种宏变量的值,很难说出您提到的错误来自何处,因为您似乎在使用PUT语句生成代码,为什么不使用数据集而不是宏变量来驱动流程。这应该比宏代码更容易调试。生成代码文件后,使用
%include
执行它。问题是如何生成所显示的语法?或者如何执行您显示的语法?如果是前者,则显示需要更改的信息来源。如果是后者,则显示您已尝试过的内容。