1

我正在尝试从数据库(MS Access 或 SQL 服务器)加载数据,odbc sqlfile似乎代码运行时出现任何错误,但我没有获取数据。我正在使用以下代码odbc sqlfile("sqlcode.sql"),dsn("mysqlodbcdata")。请注意,sqlcode.sql它只包含sql带有SELECT. 问题是相同的sql代码使用odbc load,exec(sqlstmt) dsn("mysqlodbcdata"). 谁能建议我如何使用odbc sqlfile导入数据?这对我来说将是一个很大的帮助。

谢谢乔伊

4

2 回答 2

6

sqlfile 不加载任何数据。它只是执行(并在指定大声选项时显示结果),而不将任何数据加载到 Stata。这有点违反直觉,但确实如此。odbc 命令的 pdf/dead tree 手册条目中有些不透明地解释了原因。

这是一个更有帮助的答案。假设您有名为 sqlcode.sql 的 SQL 文件。你可以在Stata中打开它(只要不是太长太长取决于你的Stata风格)。基本上,-file read- 逐行读取 SQL 代码,将结果存储在名为 exec 的本地宏中。然后将该宏作为参数传递给 -odbc load- 命令:

更新代码以处理一些双引号问题

将以下代码剪切并粘贴到名为 loadsql.ado 的文件中,您应该将其放在 Stata 可以看到的目录中(如 ~/ado/personal)。您可以使用 -adopath- 命令找到此类目录。

program define loadsql
*! Load the output of an SQL file into Stata, version 1.3 (dvmaster@gmail.com)
version 14.1
syntax using/, DSN(string) [User(string) Password(string) CLEAR NOQuote LOWercase SQLshow ALLSTRing DATESTRing]

#delimit;
tempname mysqlfile exec line;

file open `mysqlfile' using `"`using'"', read text;
file read `mysqlfile' `line';

while r(eof)==0 {;
    local `exec' `"``exec'' ``line''"';
    file read `mysqlfile' `line';
};

file close `mysqlfile';


odbc load, exec(`"``exec''"') dsn(`"`dsn'"') user(`"`user'"') password(`"`password'"') `clear' `noquote' `lowercase' `sqlshow' `allstring' `datestring';

end;

/* 全部完成!*/

Stata 中的语法是

loadsql using "./sqlfile.sql", dsn("mysqlodbcdata") 

您还可以添加所有其他 odbc 加载选项,例如 clear。显然,您需要更改文件路径和 odbc 参数以反映您的设置。这段代码应该和 -odbc sqlfile("sqlfile.sql"), dsn("mysqlodbcdata") 做同样的事情——加上实际加载数据。

我还添加了指定数据库凭据的功能,如下所示:

loadsql using "./sqlfile.sql", dsn("mysqlodbcdata") user("user_name") password("not12345") 
于 2012-09-04T23:26:08.030 回答
1

对于“--XYZ”样式的注释,请执行以下操作(假设您的 SQL 代码中没有“--”):

if strpos(`"``line''"', "--") > 0 {;
    local `line' = substr(`"``line''"', 1, strpos(`"``line''"', "--")-1);
    };

我必须将此作为答案发布,否则格式会全部搞砸,但这显然是指 Dimitriy 的代码。(您还可以定义一个本地宏来保存“--”字符串的位置,以使您的代码更简洁。)

于 2017-09-25T04:53:24.737 回答