我正在尝试使用odbc sqlfile
从数据库(MS Access或SQL服务器)加载数据,似乎代码运行时出现任何错误,但我没有获取数据。我使用以下代码odbc sqlfile("sqlcode.sql"),dsn("mysqlodbcdata")
。请注意,sqlcode.sql
仅包含sql
SELECT
语句。问题是相同的sql
代码正在使用odbc load,exec(sqlstmt) dsn("mysqlodbcdata")
提供数据。任何人都可以建议我如何使用odbc sqlfile
导入数据?这对我来说是一个很大的帮助。
由于 喜悦
答案 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的代码。 (您还可以定义一个保持“ - ”字符串位置的本地宏,以使您的代码更清晰。)