Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы сохранить точность, типы decimal или numeric всегда извлекаются как строки с особой точностью и масштабом. Если какое-либо значение меньше 1, начальный ноль отсутствует. Это аналогично полям money и smallmoney, так как они являются десятичными полями с фиксированным масштабом равным 4.
Добавление ведущих нулей, если они отсутствуют
Начиная с версии 5.6.0, параметр FormatDecimals добавляется на уровнях подключения sqlsrv и инструкции, что позволяет пользователю форматировать десятичные строки. Этот параметр принимает логическое значение (true или false) и влияет только на форматирование десятичных и других числовых значений в полученных результатах. Иными словами, параметр FormatDecimals не влияет на другие операции, такие как вставка или обновление.
Значение FormatDecimals по умолчанию — false. Если задано значение true, то начальные нули в десятичных строках будут добавлены для любого десятичного значения меньше 1.
Настройка числа десятичных знаков
Если FormatDecimals включён, другой параметр, DecimalPlaces, позволяет пользователям настраивать количество знаков после запятой при отображении данных типов money и smallmoney. Он принимает целочисленные значения в диапазоне [0, 4] и может выполнять округление отображаемого числа. Однако базовые денежные данные остаются неизменными.
Для обоих параметров можно задать уровень подключения или уровень инструкции, при этом настройка на уровне инструкции всегда переопределяет соответствующую настройку на уровне подключения. Обратите внимание, что параметр DecimalPlaces влияет только на денежные данные, а параметр FormatDecimals должен иметь значение true, чтобы параметр DecimalPlaces вступил в силу. В противном случае форматирование отключается независимо от параметра DecimalPlaces.
Примечание.
Так как поля money или smallmoney имеют масштаб 4, то при установке значения DecimalPlaces любое отрицательное число или любое значение больше 4 будет игнорироваться. Не рекомендуется использовать какие-либо отформатированные денежные данные в качестве входных данных для каких-либо вычислений.
Пример — простое получение
В следующем примере показано, как использовать новые параметры в простой выборке.
<?php
$username = '<user_id>';
$password = '<password>';
$tableName = 'mytable';
$connectionInfo = array("UID" => $username, "PWD" => $password, "Database" => "<database>", "FormatDecimals" => true);
$server = "<server>"; // IP address also works
$conn = sqlsrv_connect( $server, $connectionInfo);
$numDigits = 2;
$query = "SELECT money1 FROM $tableName";
$options = array("DecimalPlaces" => $numDigits);
$stmt = sqlsrv_prepare($conn, $query, array(), $options);
sqlsrv_execute($stmt);
if (sqlsrv_fetch($stmt)) {
$field = sqlsrv_get_field($stmt, 0);
echo $field; // expect a numeric value string with 2 decimal places
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
Пример. Форматирование параметра вывода
Если десятичное или числовое поле возвращается в качестве параметра вывода, то возвращаемое значение будет рассматриваться как обычная строка типа varchar. Однако если указано SQLSRV_SQLTYPE_DECIMAL или SQLSRV_SQLTYPE_NUMERIC, можно задать для FormatDecimals значение true, чтобы в начале числового строкового значения не отсутствовал ноль. Дополнительные сведения см. в практическом руководстве по извлечению параметров вывода с помощью драйвера SQLSRV.
В следующем примере показано, как форматировать параметр вывода хранимой процедуры, возвращающий значение decimal(8,4).
$outString = '';
$outSql = '{CALL myStoredProc(?)}';
$stmt = sqlsrv_prepare($conn,
$outSql,
array(array(&$outString, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_DECIMAL(8, 4))),
array('FormatDecimals' => true));
if (sqlsrv_execute($stmt)) {
echo $outString; // expect a numeric value string with no missing leading zero
}