В 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 в середине для подключения к моей базе данных дает мне некоторый контроль над такими функциями, как эта.
Надеюсь, это кому-то пригодится.
Других решений пока нет …