Php MS-SQL中的重复密钥
在MySQL中,制作双主键非常容易,然后我们就可以运行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语法 我的问题是,我可以在其中传递一个存储过程吗?表名、要插入的字段,然后是要更新的值 然后,我希望存储过程能够消除这种情
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函数来为您检查主键,即只为您运行检查的函数(表、键、值、更新)?