Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MS-SQL中的重复密钥_Php_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Php MS-SQL中的重复密钥

Php MS-SQL中的重复密钥,php,sql,sql-server,stored-procedures,Php,Sql,Sql Server,Stored Procedures,在MySQL中,制作双主键非常容易,然后我们就可以运行 INSERT INTO table x SET val = x, val2 = y, val3 = z, ON DUPLICATE KEY SET val3 = z 这样可以节省时间,而无需进行计数,然后根据结果进行插入或更新 这在MS SQL中似乎非常复杂,因为它选择了这种MERGE语法 我的问题是,我可以在其中传递一个存储过程吗?表名、要插入的字段,然后是要更新的值 然后,我希望存储过程能够消除这种情

在MySQL中,制作双主键非常容易,然后我们就可以运行

 INSERT INTO table x 
 SET
    val = x,
    val2 = y,
    val3 = z,
  ON DUPLICATE KEY SET val3 = z
这样可以节省时间,而无需进行计数,然后根据结果进行插入或更新

这在MS SQL中似乎非常复杂,因为它选择了这种
MERGE
语法

我的问题是,我可以在其中传递一个存储过程吗?表名、要插入的字段,然后是要更新的值

然后,我希望存储过程能够消除这种情况,只需执行更新或插入,无论是必要的操作,就像MySQL一样

总的来说,我对存储过程不是很在行,目前我正在尝试删除行,然后将它们重新插入,因为这似乎是最容易做到的事情


我现在使用的是PHP和ms sql 2012,我想这里有一个存储过程方法,但是缺少输入意味着我基本上完成了一个upsert函数

我已经让它接受了表、键、值和更新参数

public function upsert($table,$keys,$insert,$update) {

        $query = $this->from($table)->select(null)->select('COUNT(1) AS c');
        foreach($keys as $index=>$value) {
            $query->where($index,$value);
        }
        $result = $query->fetchAll();

        if($result[0]['c'] == 0) {
            //insert!
            $query = $this->insertInto($table,$insert);



            $query->execute();

        }
        else {
            $query = $this->update($table,$update);
            foreach($keys as $index=>$value) {
                $query->where($index,$value);
            }
            $query->execute();

        }

    }
我已经将它添加到我一直在使用的fluentPDO对象中,并以正常的php方式运行检查。可能不是最好的方法,但这对我来说是有效的,并且使用中间的PDO对象连接到我的数据库,可以让我对这样的函数进行一些控制。
希望这对某些人有用。

MySQL语法对我来说太可怕了。它基本上是说“如果这不起作用,就编一个数字,然后再试一次”看看这个问题,它可能会帮助你:谢谢,我读过类似的东西,但我正在寻找一种非常通用的方法来解决这个问题。就像我说的,我对存储过程不是很在行,所以如果有人能写一个,那就太好了。也许最好的方法是创建一个php函数来为您检查主键,即只为您运行检查的函数(表、键、值、更新)?