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にデータをロードせずに、実行するだけです(そして、loudオプションが指定されている場合は結果を表示します)。これはやや直感に反しますが、真実です。その理由は、odbcコマンドのpdf /deadtreeマニュアルエントリでやや不透明に説明されています。

ここにもっと役立つ答えがあります。sqlcode.sqlという名前のSQLファイルがあるとします。Stataで開くことができます(長すぎない限り、長すぎるのはStataのフレーバーによって異なります)。基本的に、-file read-はSQLコードを1行ずつ読み取り、結果をexecという名前のローカルマクロに格納します。次に、そのマクロを引数として-odbcload-コマンドに渡します。

いくつかの二重引用符の問題に対処するためにコードを更新しました

次のコードを切り取って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") 

また、clearなどの他のすべてのodbcロードオプションを追加することもできます。明らかに、セットアップを反映するためにファイルパスとodbcパラメーターを変更する必要があります。このコードは、-odbc sqlfile( "sqlfile.sql")、dsn( "mysqlodbcdata")-と同じことを実行し、さらに実際にデータをロードする必要があります。

また、次のようにDBクレデンシャルを指定する機能を追加しました。

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 に答える