0

私たちのグループで退職した人がいて、私は彼のマージ ステートメント (および関連するコード) が何をするのかを理解しようとしています。そうすれば、送信する前に一部の (すべてではない) 値を整数に変換する方法を決定できます。質問については、以下のコメントを参照してください。私は Microsoft SQL のまったくの初心者で、数年前に php のクラスを受講しましたが、あまり経験がありません。マージ コマンドをグーグルで検索してみましたが、いくつかの部分で問題が発生しています。以下の私の質問を参照してください。(// ?) 私は見ました:

  http://php.net/manual/en/pdo.query.php
  http://stackoverflow.com/questions/4336573/merge-to-target-columns-using-source-rows
  http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fsqlp%2Frbafymerge.htm

これらが基本的な質問であることは理解していますが、私はそれを理解しようとしていますが、この周りの誰も知りません.

function storeData ($form)
{
global $ms_conn, $QEDnamespace;
//I'm not sure what this is doing??  I thought this was where it was sending data up??
$qry = "MERGE INTO visEData AS Target
    USING (VALUES (?,?,?,?,?,?,?,?,?,?))
           AS Source (TestGUID,pqID, TestUnitID, TestUnitCountID,
           ColorID, MeasurementID, ParameterValue,
           Comments, EvaluatorID, EvaluationDate)
    ON Target.pqID = Source.pqID 
        AND Target.MeasurementID=Source.MeasurementID  //what is this doing? 
        AND Target.ColorID=Source.ColorID  //what is target and source? 
    WHEN MATCHED THEN
        UPDATE SET ParameterValue = Source.ParameterValue,
            EvaluatorID = Source.EvaluatorID, //where is evaluatorID and source? My table or table we're send it to?
            EvaluationDate = Source.EvaluationDate,
            Comments = Source.Comments
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (TestGUID,
            pqID, TestUnitID, TestUnitCountID,
            ColorID, MeasurementID,
            ParameterValue, Comments,
            EvaluatorID, EvaluationDate, TestIndex, TestNumber) 
        VALUES (Source.TestGUID, Source.pqID, 
                       Source.TestUnitID, 
                       Source.TestUnitCountID,
           Source.ColorID, Source.MeasurementID, Source.ParameterValue,
           Source.Comments, Source.EvaluatorID, Source.EvaluationDate,?,?);";

$pqID = coverSheetData($form);
$tid = getBaseTest($form['TextField6']);
$testGUID = getTestGUID($tid);
$testIndex = getTestIndex ($testGUID);
foreach ($form['visE']['parameters'] as $parameter=>$element)
{
    foreach ($element as $key=>$data)
    {
        if ( mb_ereg_match('.+evaluation', $key) === true )
        {
            $testUnitData = getTestUnitData ($form, $key, $tid, $testGUID);
            try
            {
               //I'm not sure if this is where it's sent up?? 
               //Maybe I could add the integer conversion here??
               $ms_conn->query ($qry, array(
                 $testGUID, $pqID,
                 $testUnitData[0], $testUnitData[1], $testUnitData[2],$element['parameterID'], $data, $element['comments']  $QEDnamespace->userid, date ('Y-m-d'), $testIndex, $tid));
                                     }
            catch (Zend_Db_Statement_Sqlsrv_Exception $e)
            {
                dataLog($e->getMessage());
                returnStatus ("Failed at: " . $key);
            }
        }
    }
}

}
4

1 に答える 1

0

これはコメントとしては少し長いです。SQL Server を使用している場合は、mergeに関する SQL Server のドキュメントを参照してください。SQL Server のドキュメントはすべてオンラインで公開されており、Google 経由で簡単に見つけることができます (おそらく Bing を使用するとさらに簡単になります)。

MERGE コマンドの目的は、挿入と更新の両方を 1 つのステップで行うことです。基本的に、新しいデータを含むテーブル (「ソース」) と更新するテーブル (「ターゲット」) があります。レコードが一致すると、ソース内の一致するレコードでターゲット内の既存のレコードを更新します。レコードが一致しない場合は、それをターゲットに挿入します。

2 つのステートメントに対する MERGE の主な利点は、必ずしもエレガントで直感的に明白な構文ではありません。主な利点は、すべての操作が単一のトランザクションで発生するため、すべてが成功するか失敗するかのいずれかになります。

構文は実際にはそれほど悪くありません。テスト データベースをセットアップし、自分でいくつかの例を試して、少なくとも構文を理解することをお勧めします。その後、このコードに戻ります。その際、結果のマージ ステートメントを印刷して SQL Server Management Studio に配置すると、ステートメントの適切な色分けされたキーワードが表示されます。次に、それを段階的に見ていくと、おそらくそれが非常に理にかなっていることがわかるでしょう。

于 2013-06-05T14:53:26.667 に答える