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,请查看有关合并的 SQL Server 文档。所有 SQL Server 文档都在线,通过 Google 很容易找到(使用 Bing 可能更容易)。

MERGE 命令的目的是一步完成插入和更新。基本上,您有一个包含新数据的表(“源”)和一个要更新的表(“目标”)。当记录匹配时,使用源中的匹配记录更新目标中的现有记录。当记录不匹配时,将其插入目标。

与两个语句相比,MERGE 的主要优势不一定是优雅且直观的语法。主要优点是所有操作都发生在单个事务中,因此它们要么全部成功,要么全部失败。

语法实际上并没有那么糟糕。我建议您建立一个测试数据库并自己尝试一些示例,这样您至少了解语法。然后,返回此代码。这样做时,打印出结果合并语句并将其放入 SQL Server Management Studio 中,您将在其中为语句提供漂亮的颜色编码关键字。然后一步一步地过一遍,你可能会发现它很有道理。

于 2013-06-05T14:53:26.667 回答