【问题标题】:Use SAS Macro Variable within Proc SQL Teradata passthrough在 Proc SQL Teradata 直通中使用 SAS 宏变量
【发布时间】:2015-10-21 06:14:48
【问题描述】:

我有一个希望使用 SAS EG (9.4) 自动执行的 SQL 语句。以下语句已在 Teradata SQL 助手中测试并有效。

select * from TD.DATA where date='2015-06-01'

现在我希望通过 proc SQL 传递来推动它,并将日期提供给 SQL 程序,就像这样......

proc sql;
connect to teradata as tera(user=&tera_user password="&tera_pwd" tdpid=terap);
create table MYDATA as 
select * from connection to tera
(
select * from TD.DATA where date='2015-06-01'
);
disconnect from tera;
quit;

上面的代码已经过测试并产生与前面的 SQL 语句完全相同的输出。但是,我真正想要的是做这样的事情:

%let input_date='2015-06-01';
proc sql;
connect to teradata as tera(user=&tera_user password="&tera_pwd" tdpid=terap);
create table MYDATA as 
select * from connection to tera
(
select * from TD.DATA where date=&input_date.
);
disconnect from tera;
quit;

我尝试了各种引用和不同日期格式的组合......我在这里错过了什么?谢谢。

【问题讨论】:

  • 尝试使用%STR(') 而不是单引号
  • 奇怪-您提供的代码对我来说看起来不错(在宏变量内分配了单引号)。我针对 mySQL 数据库对其进行了测试,它运行良好。你能再试一次来逗我开心吗,因为我很难相信它不起作用。也许在新的 SAS 会话中进行。

标签: sql sas


【解决方案1】:

试试这个:

%let input_date=2015-06-01;
proc sql;
connect to teradata as tera(user=&tera_user password="&tera_pwd" tdpid=terap);
create table MYDATA as 
select * from connection to tera
(
select * from TD.DATA where date=%str(%'&input_date%')
);
disconnect from tera;
quit;

【讨论】:

  • 谢谢,斯蒂格。尽管我更喜欢 Chris J 的解决方案,但这很有效。它看起来更干净一些。
  • 嗨,是的,BQUOTE 看起来更好,我将来也会使用它;)
【解决方案2】:

您可以使用%BQUOTE() 宏函数来解析单引号内的宏变量。

%let input_date = 2015-06-01; 过程 sql; 以 tera 身份连接到 teradata(user=&tera_user password="&tera_pwd" tdpid=terap); 创建表 MYDATA 为 选择 * 从连接到 tera ( select * from TD.DATA where date = %BQUOTE('&INPUT_DATE') ); 断开与 tera 的连接; 放弃;

【讨论】:

  • 谢谢,克里斯!这个方案很完美,又学习了一个新的宏功能。
  • 我收到“Teradata 准备:字符串转换为数值失败”。有什么想法吗?
  • @csetzkorn 该字符串是否表示有效日期?
【解决方案3】:

就像日期 201501 这样的格式来制作一个工作宏变量

%let input_date = 201506;
%let input_date2=input(put(intnx('month',%sysfunc(inputn(&input_date,yymmn6.)),0,'b'),10.),yymmddd10.)
proc sql;
  connect to teradata as tera(user=&tera_user password="&tera_pwd" tdpid=terap);
  create table MYDATA as 
  select * from connection to tera
  (
   select * from TD.DATA where date = %BQUOTE('&INPUT_DATE2')
  );
  disconnect from tera;
quit;

【讨论】:

  • 你能解释一下吗? %BQUOTE('&INPUT_DATE2') 的假定作用是什么?
  • 就像 input_date=2015-06-01
猜你喜欢
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多