0

ストアドプロシージャを実行していて、55レコードを返すc#コードで結果をフェッチしている状況があります。今度は、別のSQLクエリを実行した結果として表示する必要のある列が行にあります。どうしてもやってみましたが、どうすればいいのかわかりませんでした。助けてください。

正常に機能するプロシージャを呼び出すC#コードは次のとおりです。

public static MonthlyFinancialReportCollection GetList(SASTransaction withinTransaction)
{
    MonthlyFinancialReportCollection records = null;

    using (DataSet ds = Helpers.GetDataSet("ShowPremiumCalcReport", withinTransaction))
    {
        if (ds.Tables.Count > 0)
        {
            records = new MonthlyFinancialReportCollection();

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                if (!string.IsNullOrEmpty(dr[0].ToString())) 
                     records.Add(FillDataRecord(dr));                        
            }
        }
    }

    return records;
}

次に、上記の関数で呼び出されたプロシージャに対してクエリを実行したいので、列の1つにクエリの計算結果が入力されます。

select 
    Sum(WorkingHours.WHO_Amount * dbo.PremiumLevel.PLE_Premium) as Snr_Teaching_Amt
from policy, policyline, coveroption,
     premiumlevel, WorkingHours
where policy.pol_id=policyline.pli_pol_id 
and   policyline.pli_cop_seniorteachingcoverid=coveroption.cop_id 
and   premiumlevel.ple_own_id=policy.pol_own_id 
and   premiumlevel.ple_sca_id=coveroption.cop_sca_id 
and   WorkingHours.who_pos_id=policyline.pli_pos_id
and   pol_dcsf=row["snr teaching staff"]`
4

2 に答える 2

0

これは問題ではありません

最初のオプション

 You execute the first stored procedure.
 Then foreach row 
    You execute the Second one with a parameter from the first one
 endfor

2番目のオプション:

 You use a Cursor on the first stored procedure to get all the results in one call
于 2012-09-03T14:10:06.597 に答える
0

最も遅くて簡単な方法:

  • 2 番目のクエリを、「snr 教職員」をパラメーターとして受け入れるストアド プロシージャにします。
  • ds.Tables[0].Columns.Add("Snr_Teaching_Amt", typeof(decimal)); を使用して、最初のクエリから DataTable に新しい列を追加します。
  • 作成した 2 番目のストアド プロシージャの SqlCommand と SqlParameter を作成します。
  • DataTable をループし、SqlParameter の値に「snr 教職員」を入れます。
  • ExecuteScalar を使用して SqlCommand を実行します。返される値は、作成した列に保持できる 2 番目のクエリの結果です。

ただし、55 + 1 回のサーバー ラウンド トリップが発生するため、この方法はお勧めしません。

中間の方法:

2 番目のクエリは単一の値を返すため、2 番目のクエリを Sql 関数にします。次のような最初の手順で呼び出すことができます。

SELECT *, dbo.MyFunction([snr teaching staff]) AS Snr_Teaching_Amt FROM ...

これにより、パフォーマンスが向上し、保守が容易になります。ただし、Massanu に同意します。サブクエリを使用して手順を組み合わせることができます。頑張ってください;-)

于 2012-09-03T15:26:36.000 に答える