4

附录:从 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).

4

4 回答 4

3

我不熟悉 Stata,但我猜您的 ODBC 正在以“ANSI”模式连接。尝试在create volatile tableselect语句之间添加:

commit work;

如果这不起作用,您可能需要以某种方式进行两次单独的调用。

更新: 多想一下,也许你可以试试这个:

odbc load, exec("select distinct user_id from dw_users where cast(date_confirm as
date) > '2011-09-15'") clear dsn("mozart") lowercase;

换句话说,只需一步执行查询;不要尝试创建易失性表。

于 2013-02-13T20:10:06.833 回答
2

如果您在连接模式为 TERADATA 时尝试以下操作(这通常不是默认的),该怎么办:

odbc load, exec("BT; create volatile table new_usr as
(select top 10 user_id from dw_users) with data primary index(user_id) on commit
preserve rows; 
ET;

select * from new_usr;") clear dsn("mozart") lowercase;

BT;and语句将ET;包含在显式事务中的 SQL 包装起来。此 SQL 已在 SQL 助手中测试,因为我无权访问您正在使用的工具。通常,BT用于ET强制执行必须成功完成或所有内容都回滚的逻辑事务(或工作单元)。这可以让您解决您在工具中遇到的问题。

编辑

如果无法将 Volatile Table 创建包装在 BT 和 ET 中,您是否有能力创建一个存储过程或宏来嵌入完成任务所需的所有逻辑,然后从 Stata 调用存储过程或宏?

于 2013-02-20T15:19:15.727 回答
2

英国电信;--UR 逻辑-- ET;

如果中间有任何事情失败。它会回滚

这里得到

于 2014-03-11T01:23:24.017 回答
0

这个答案不再正确。只要将multistatement选项添加到odbc命令中,Stata 现在就允许多个 SQL 语句。


Stata 的odbc命令不允许将多个 SQL 语句组合成一个odbc命令并改变 TD 的模式。它还为odbc发出的每个命令创建一个单独的连接,因此当您想要使用它来做某事时,易失性表就会消失。这使得无法直接使用易失性表。

但是,有一种方法可以通过 Stata 使用 R 来生成 Stata 数据文件。您需要rsource从 SSC 和foreignR中的包进行安装。可以在 sysprofile.ado 或您自己的 profile.ado 中定义RODBC2 个全局变量 Rterm_path 和 Rterm_options 。rsource据我所知,R 不允许导出时间戳,所以我必须手动对日期和时间戳进行一些转换。这些转换与Stata 手册Stata 博客中的建议有些不一致。

rsource, terminator(END_OF_R)
  library("RODBC")
  library("foreign")
  db <- odbcConnect("mydsn")
  sqlQuery(db,"CREATE VOLATILE MULTISET TABLE vol_tab AS (SELECT ...) WITH DATA PRIMARY INDEX(...) ON COMMIT PRESERVE ROWS;")
  data<- sqlQuery(db,"SELECT * FROM vol_tab;",rows_at_time=1)
  write.dta(data,"mydata.dta",convert.dates = FALSE)
  close(db)
END_OF_R

use "mydata.dta", replace
/* convert dates and timestamps to Stata format */
gen stata_date = rdate + td(01jan1970)
format stata_date %td
gen double stata_timestamp = (rtimestamp + 315594000)*1000
format stata_timestamp %tc
于 2014-12-03T03:10:27.907 回答