2012-09-04 48 views
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導入數據?這對我來說是一個很大的幫助。stata odbc sqlfile

由於 喬伊

+0

這個工作適合您嗎? –

回答

6

SQLFILE不加載任何數據。它只是執行(並在指定響亮選項時顯示結果),而不會將任何數據加載到Stata中。這有點反直覺,但是是真的。原因在odbc命令的pdf/dead tree手冊條目中有些不明確的解釋。

這是一個更有幫助的答案。假設你有你的SQL文件名爲sqlcode.sql。你可以打開它在Stata(只要它不是長,其中太長取決於你的味道Stata)。基本上,文件讀取 - 逐行讀取SQL代碼,將結果存儲在名爲exec的本地宏中。然後,你傳遞宏作爲參數傳遞給-odbc負載命令:

更新的代碼來處理一些雙引號問題

剪切&下面的代碼粘貼到一個名爲loadsql.ado文件,該文件你應該把目錄放在Stata可以看到的目錄中(比如〜/ ado/personal)。你可以用-adopath-命令找到這樣的目錄。

program define loadsql 
*! Load the output of an SQL file into Stata, version 1.3 ([email protected]) 
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加載選項,如透明,以及。顯然,您需要更改文件路徑和odbc參數以反映您的設置。這段代碼應該和-odbc sqlfile(「sqlfile.sql」),dsn(「mysqlodbcdata」)一樣 - 加上實際加載的數據。

我還添加了功能,以指定數據庫憑據這樣的:

loadsql using "./sqlfile.sql", dsn("mysqlodbcdata") user("user_name") password("not12345") 
+0

這可能會被SQL文件中的註釋混淆。 –

+0

嗨@dimitriy,我已經嘗試了代碼,並收到一個非常簡單的「select count(*)...」語句的錯誤。它讀取「表或exec()是必需的」。有什麼建議?在stata中以交互方式運行簡單的sql語句也不錯。這似乎不太可能,但也許我對sql變量使用引號會讓事情變得糟糕? –

+1

行情似乎弄亂了它。你能給我一個你如何在sql文件中使用引號的例子嗎?我可能會破解一些東西。 –

1

對於「--XYZ」風格的註釋,做這樣的事情(假設你沒有「 - 」在你的SQL代碼):

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

我不得不張貼此作爲一個答案,否則格式化會已經全亂了,但它顯然是指Dimitriy的代碼。 (您也可以定義一個保存「 - 」字符串的位置的本地宏,以使您的代碼更清潔一些。)