gpt4 book ai didi

sql - 在 SAS Proc Sql 中进行动态 SQL 查询

转载 作者:行者123 更新时间:2023-12-02 21:56:46 24 4
gpt4 key购买 nike

以下编辑反射(reflect)了所取得的一些进展:

我有以下有效的功能:

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。我可以通过某种方式传递整个字符串吗?是否可以通过这种方式根据输入构建字符串?

最佳答案

您的第一个问题是通过对 SAS 宏的误解来解释的。当你这样写时:

%let a = "YEAR(myDate) AS yr, MONTH(myMonth) AS mo, id";

SAS 将输入您的查询:

"YEAR(myDate) AS yr, MONTH(myMonth) AS mo, id"

即:它将保留引号。如果您想在将函数放入 SAS 宏变量时“隐藏”函数之类的内容,则必须使用 %str() 函数而不是“或”。所以如果你写:

%str(YEAR(myDate) AS yr, MONTH(myMonth) AS mo, id);

你会得到一些有用的东西。

回答你的第二个问题:这当然是可能的。但请记住一些非常重要的事情:任何宏函数、宏变量定义或对开放代码中的宏变量的调用,都会在 SAS 代码运行之前进行解释和替换。如果您有一个依赖于 SAS 数据步骤或过程结果的宏变量/函数,则需要将其封装在宏函数中:其中的所有内容仅在运行时解释和替换。

编辑回答您的评论:我传递的主要是一般建议,因为您似乎不熟悉 SAS Macro。在某些情况下,您可能会得到奇怪的结果,看起来您的宏变量没有设置/更改,如果您没有意识到这一点,这可能会令人沮丧。 (我们都是第一次遇到它;))

在您的具体情况下,如果我们假设您已经创建了一个返回适当选择部分的 sqldate 宏,那么您最好立即将其放入查询中。例如:

%macro sqldate(period);
&period.(mydate) as period
%mend;
/*note no semicolon, since a macro function is basically the same as saying: resolve this piece of macro code and add the result directly to my written code.*/

proc sql;
select %sqldate(month)
from mytable;
quit;
/*also note: you end proc sql with a quit statement instead of run*/

关于sql - 在 SAS Proc Sql 中进行动态 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17624273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com