У меня есть специальный оператор MSSQL, который я использую для получения идентификатора указанной строки, которая либо уже существует, либо вставляет INSERT, а затем извлекает этот идентификатор. Этот SQL отлично работает в SQL Management Studio, а также в паре моих приложений .NET C#.
К сожалению, меня попросили использовать PHP для этой конкретной задачи, и я испытываю большие трудности при попытке использовать PHP и официальный драйвер Microsoft SQL.
Оператор не возвращает идентификатор после INSERT (или, если это так, я не могу его получить). Может кто-нибудь посмотреть, где и если я ошибаюсь?
Я использую PHP 5.3.23 с драйвером Microsoft SQL 3.0. Вот мой код:
$sql = ''
. 'IF (SELECT COUNT(*) FROM users WHERE sAMAccountName = ?) = 0 '
. 'BEGIN '
. 'INSERT INTO users (role, sAMAccountName, fullName) '
. 'VALUES (1, ?, ?) '
. 'SELECT SCOPE_IDENTITY() '
. 'END '
. 'ELSE SELECT id FROM users WHERE sAMAccountName = ?';
$params = array($requester, $requester, $fullName, $requester);
$query = $this->SqlQuery($sql, $params);
function SqlQuery($sql, array $params) {
$conn = $this->SqlConnection(null, null, null, null); // x4 null = use default connection options
$query = sqlsrv_query($conn, $sql, $params);
if ($query) {
sqlsrv_fetch($query);
echo 'Result: ' . sqlsrv_get_field($query, 0); // This should return an ID regardless
sqlsrv_close($conn);
}
}
Вот результат HTML (без результата):
Result:
--
). Помимо этого все в SQL (и T-SQL), включая несколько операторов, можно писать без разрывов строк. Традиционно разделители операторов (;
) не были необходимы, хотя они необходимы для новых ключевых слов операторов (WITH
,RECEIVE
, ..) и потребуются в будущем. - person RBarryYoung   schedule 22.07.2014