stata odbc sqlfile

时间:2012-09-04 19:42:08

标签: sql odbc stata

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

由于 喜悦

2 个答案:

答案 0 :(得分:6)

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

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

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

Cut&将以下代码粘贴到名为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") 

答案 1 :(得分:1)

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

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

我不得不将此作为答案发布,否则格式化将全部搞砸,但它显然是指Dimitriy的代码。 (您还可以定义一个保持“ - ”字符串位置的本地宏,以使您的代码更清晰。)