【发布时间】:2013-07-12 21:27:04
【问题描述】:
以下是反映所取得进展的修改:
我有以下有效的功能:
proc fcmp outlib=mydir;
function sqlWhere(interval $, myDate $) $;
...
return("id");
endsub;
quit;
这是经过测试并且工作正常。所以我尝试了:
%macro sqlWhere(interval, myDate);
&interval.("year") AS t
&myDate.("someDateField") AS tt
%mend;
proc sql;
CREATE TABLE test AS (
SELECT %sqlWhere(t, tt)
FROM myTable);
quit;
当我运行选择时,顶部运行良好。但是,proc sql 爆炸并说我缺少逗号。我很困惑,因为该函数在其他应该使代码工作的测试中返回“ id ”。错误说“tt”部分缺少逗号...
我正在尝试在 SAS 中进行动态查询。我有几个问题,我不确定我想做的事情是否可行。另外,很抱歉删除了之前的问题;我想给出一个更好的解释。
假设我有这个代码:
proc sql;
SELECT
YEAR(myDate) AS yr,
MONTH(myDate) AS mo,
id
FROM
myTable;
run;
我试图让它有条件。这带来了两个问题。首先,我无法使用基本语法。其次,我无法让我的自定义函数创建正确的字符串。
我想要这样的东西:
%let a = sqlDate("month");
proc sql;
SELECT
&a
FROM
myTable;
run;
这个结构不起作用,即使我放弃这个功能,直接进入
%let a = "YEAR(myDate) AS yr, MONTH(myMonth) AS mo, id";
这样的事情可能吗?
我的第二个问题是如何构造函数本身,但我想确认我什至可以先做这样的事情。我基本上是在主程序中放置一个指标,它可以是“日”、“周”、“月”或“年”,然后告诉程序以给定的方式查询 SQL。我可以以某种方式传递整个字符串吗?是否可以以这种方式根据输入构建字符串?
【问题讨论】:
-
您确实忽略了此行末尾宏中的逗号: &interval.("year") AS t 在 sql 选择中,您需要用逗号分隔您选择的不同内容,但变量 t 的部分和变量 tt 的部分之间没有。 (放在不同的行不会让你不必放置逗号。;))
-
我发现这个对宏变量和宏的解释非常有用:“SAS® Macros Are Just Text Substitution!” ... ARRRRGGGHHH!!!
-
嘿伙计们,我只是无法让它与该功能一起使用。这些都是很好的信息,但我将提出一个更具体的新问题,看看是否可以缩小我做错的范围。