新手试图破译合并命令相关代码

时间:2013-06-05 13:35:00

标签: php sql sql-server merge

有人在我们的小组中退休,我试图弄清楚他的合并声明(和相关代码)是做什么的,所以我可以确定如何在发送之前将一些(不是全部)值转换为整数。请参阅以下评论以获取问题我是Microsoft SQL的绝对新手,几年前参加了一个PHP课程,但没有多少经验。我已经尝试使用googling合并命令,但我在其中有几个部分遇到了问题。请参阅下面的问题。 (//?) 我看过了:

  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);
            }
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

评论有点长。如果您使用的是SQL Server,请查看merge上的SQL Server文档。所有SQL Server文档都在线,并且很容易通过Google查找(使用Bing可能更容易)。

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

MERGE相对于两个语句的主要优点不一定是优雅且直观明显的语法。主要优点是所有操作都在一个事务中进行,因此它们都可以成功,也可以全部失败。

语法实际上并没有那么糟糕。我建议你设置一个测试数据库并自己尝试一些例子,所以你至少要理解它的语法。然后,返回此代码。执行此操作时,打印输出生成的合并语句并将其放在SQL Server Management Studio中,您将在该文档中为该语句提供颜色编码的关键字。然后一步一步地完成它,你可能会发现它很有意义。