有没有办法调整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的连接仍然是开放的。
答案 0 :(得分:3)
我不熟悉Stata,但我猜你的ODBC是以“ANSI”模式连接的。尝试在create volatile table
和select
语句之间添加:
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中进行了测试,因为我无法访问您正在使用的工具。通常,BT
和ET
用于强制必须成功完成或回滚所有内容的逻辑事务(或工作单元)。这可以让您解决您在工具中遇到的问题。
修改强>
无法将易失性表创建包装在BT和ET中,您是否能够创建存储过程或宏,可以嵌入完成任务所需的所有逻辑,然后从Stata调用存储过程或宏?
答案 2 :(得分:2)
答案 3 :(得分:0)
这个答案不再正确。只要将multistatement
选项添加到odbc
命令,Stata现在就允许多个SQL语句。
Stata的odbc
命令不允许将多个SQL语句组合成单个odbc
命令并改变TD的模式。它还为发出的每个odbc
命令创建一个单独的连接,因此当您想要使用它来执行某些操作时,volatile表会变得很糟糕。这使得无法直接使用易变表。
但是,有一种方法可以使用R到Stata生成Stata数据文件。您需要在SSC中安装rsource
,在R中安装foreign
和RODBC
个包。rsource
的2个全局Rterm_path和Rterm_options可以在sysprofile.ado或您的自己的个人资料。据我所知,R不允许导出时间戳,所以我不得不手动进行日期和时间戳的转换。这些转化与the Stata manuals和Stata 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