在Stata中创建和使用临时/易变数据库表

时间:2013-02-13 01:54:28

标签: sql odbc stata teradata

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

我认为潜在的问题可能是separate connections are established for each SQL statement,因此挥发性表格会在发布选择时消失。我正在等待技术支持来验证这一点。

我尝试使用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)

也许这是因为在close(db)之前,与DB的连接仍然是开放的。

4 个答案:

答案 0 :(得分: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;

换句话说,只需一步执行查询;不要试图创建一个易变的表。

答案 1 :(得分: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;ET;语句将显式事务中包含的SQL包装起来。此SQL已在SQL Assistant中进行了测试,因为我无法访问您正在使用的工具。通常,BTET用于强制必须成功完成或回滚所有内容的逻辑事务(或工作单元)。这可以让您解决您在工具中遇到的问题。

修改

无法将易失性表创建包装在BT和ET中,您是否能够创建存储过程或宏,可以嵌入完成任务所需的所有逻辑,然后从Stata调用存储过程或宏?

答案 2 :(得分:2)

BT; --UR LOGIC-- ET;

如果介于两者之间的任何事情失败。它会回滚

来自here

答案 3 :(得分:0)

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


Stata的odbc命令不允许将多个SQL语句组合成单个odbc命令并改变TD的模式。它还为发出的每个odbc命令创建一个单独的连接,因此当您想要使用它来执行某些操作时,volatile表会变得很糟糕。这使得无法直接使用易变表。

但是,有一种方法可以使用R到Stata生成Stata数据文件。您需要在SSC中安装rsource,在R中安装foreignRODBC个包。rsource的2个全局Rterm_path和Rterm_options可以在sysprofile.ado或您的自己的个人资料。据我所知,R不允许导出时间戳,所以我不得不手动进行日期和时间戳的转换。这些转化与the Stata manualsStata blog中的建议有些不一致。

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