SQL入力に対する列値考慮すべき点が2つあります。まず、コードを大幅に単純化できます。この変更により、エラーの可能性が減り、エラーを見つけやすくなります。次に、Open Database()関数の引数に使用する文字列を操作しています。二重引用符は文字列の区切り文字です。したがって、埋め込み二重引用符はエスケープシーケンス "\!"で識別される必要があります。(バックスラッシュ、バタン)。
このスクリプトをテストしてください。(できません)
dt = New Table( "Lots",
Add Rows( 5 ),
New Column( "vcLotCode", Character, Nominal, Set Values( {"lcode.0123", "12345.4321", "dcode.0123", "54321.0123", "lotcd.4567"} ) )
);
For( r = 1, r <= N Row( dt ), r++,
Eval(
Parse(
Substitute(
"dt2 = Open Database(
\!"Driver={SQL Server}; SERVER=rpt; DATABASE=FAB; UID=rrpt; \!",
\!"select vcLotCode, vcWaferCode, dAvg from fr.database where vcLotCode like '\!"LLLLL\!"'\!",
\!"Data\!"
)",
"LLLLL", dt:vcLotCode[r]
)
)
)
);SQL入力に対する列値いくつかのこと:
o Open Databaseを使用しています。 私は好きですデータベース接続を作成する + SQLを実行する + データベース接続を閉じる 。 の利点 SQLを実行するつまり、データベースへの接続を1つ作成し、それを使用して複数のSQL文を実行できます。 Open databaseはすべてのSQL文に対して新しい接続を作成します
oあなたはそれらのevalsのすべてを使う必要はない、代わりにすることなど。 さらに、datasourceやsqlcodeのように定義されていない変数もあります。
このコードを試してください:
// Data table
dt = New Table( "Lots",
Add Rows( 5 ),
New Column( "vcLotCode",
Character,
Nominal,
Set Values( {"lcode.0123", "12345.4321", "dcode.0123", "54321.0123", "lotcd.4567"} )
),
);
// Pull data from database using lot code as lookup variable
DSNString = "Driver={SQL Server}; SERVER=rpt; DATABASE=FAB; UID=rrpt; ";
// Create a connection to SQL Server
dbc = create database connection(dsnstring);
// Loop over all lot numbers
for (i = 1, i <= nrows(dt), i++,
lotcode = dt:vclotcode[i];
sqlStr = evalinsert(
"select vcLotCode, vcWaferCode, dAvg
from fr.database
where vcLotCode like '^lotcode^'");
print(sqlstr);
// Create a separate table for each lot number
dt2 = execute sql(dbc, sqlstr);
);
close database connection(dbc);
SQL入力に対する列値もう1つのコメント - LIKE演算子を使用していますが、ワイルドカードは使用していません。 おそらくあなたはこのようなことを意味しましたか?
"select vcLotCode, vcWaferCode, dAvg
from fr.database
where vcLotCode like '%^lotcode^%'");
SQL入力に対する列値私はこの場合、あなたが問い合わせをやり取りしているときに3つのステップを別々のアクションに分割することに利点があることに同意します。
この方法を使用すると、定型句sqlstrでSubstitute()を使用することもできます。
SQL入力に対する列値完璧です。 どうもありがとうございます!
SQL入力の列値これは簡単なはずですが、過去数日間にわたってさまざまな方法を試し、以前の議論を検索し、スクリプトインデックスを参照した後、私は空っぽになりました。
データテーブルの値をループして、SQLテーブルの値が「ロットコード」で、SQLクエリが「where vcLotCode like ...」であるSQLクエリの入力として使用します。 後でループを処理します。最初の値でさえ機能するのに苦労しています。 「選択」、「設定」、「取得」などのさまざまな繰り返しを試しました。 どんな助けも大歓迎です。
//データテーブルdt = New Table( "Lots"、Add Rows(5)、New Column( "vcLotCode"、Character、Nominal、Set Values({"lcode.0123"、"12345.4321"、"dcode.0123"、"54321.0123"、"lotcd.4567"}))、); //ロットコードをテーブルdt << Select Rows(1);の値に設定する1回の試行lotcode =:vcLotCode <<選択を取得; //ロットコードをルックアップ変数として使用してデータベースからデータをプルしようとするDSNString = "Driver = {SQL Server}; SERVER = rpt; DATABASE = FAB; UID = rrpt;"; sqlStr = "「" || lotcode || "」のようなvcLotCodeのfr.databaseからvcLotCode、vcWaferCode、dAvgを選択します。dt2 = Eval(Substitute(Expr(dt = Open Database(DataSource、sqlcode、"Data");)、Expr(sqlcode)、sqlstr、Expr(DataSource)、DSNString));