附录:从 Stata 14 开始,易失性表可以在没有任何黑客攻击的情况下工作。
有没有办法调整 Stata 以使用临时易失性表?在用户注销会话后,这些表和数据将被删除。
这是我在 Stata 和 Teradata 中使用的简单玩具SQL 查询的示例:
odbc load, exec("
BEGIN TRANSACTION;
CREATE VOLATILE MULTISET TABLE vol_tab AS (
SELECT TOP 10 user_id
FROM dw_users
) WITH DATA
PRIMARY INDEX(user_id)
ON COMMIT PRESERVE ROWS;
SELECT * FROM vol_tab;
END TRANSACTION;
") dsn("mozart");
这是我收到的错误消息:
The ODBC driver reported the following diagnostics
[Teradata][ODBC Teradata Driver][Teradata Database] Only an ET or null statement is legal after a DDL Statement.
SQLSTATE=25000
r(682);
Stata错误代码意味着:
错误 。. . . . . . . . . . . . . . . . . . . . . . . 返回码 682 无法连接到 odbc dsn;这通常是由于不正确的权限(例如错误的用户名或密码)而发生的。使用 set debug on 显示 ODBC 驱动程序生成的实际错误消息。
据我所知,权限很好,因为如果我只执行“SELECT TOP 10 ...”查询,我就可以提取数据。我设置了调试,但它没有产生任何额外的信息。
会话模式是 Teradata。ODBC 管理器设置为 unixODBC。我在 Ubuntu 服务器上使用 Stata 13.1。
我相信潜在的问题可能是为每个 SQL 语句建立了单独的连接,因此在发出 select 时易失性表消失了。我正在等待技术支持来验证这一点。
我尝试odbc sqlfile
很好地使用该命令,但除非我在它的末尾创建一个永久表,否则这种方法不起作用。没有加载选项odbc sqlfile
。
易失性表在SAS和 R中似乎工作得很好。例如,这完美地工作:
library("RODBC")
db <- odbcConnect("mozart")
sqlQuery(db,"CREATE VOLATILE MULTISET TABLE vol_tab AS (
SELECT TOP 10 user_id
FROM dw_users
) WITH DATA
PRIMARY INDEX(user_id)
ON COMMIT PRESERVE ROWS;
")
data<- sqlQuery(db,"select * from vol_tab;",rows_at_time=1)
也许这是因为与 DB 的连接在close(db)
.