Udostępnij przez


Formatowanie ciągów dziesiętnych i wartości pieniężnych (sterownik SQLSRV)

Pobieranie sterownika PHP

Aby zachować dokładność, typy dziesiętne lub liczbowe są zawsze pobierane jako ciągi z dokładną dokładnością i skalami. Jeśli jakakolwiek wartość jest mniejsza niż 1, brakuje zera wiodącego. Jest to taki sam przypadek z polami typu 'money' i 'smallmoney', ponieważ są to pola dziesiętne o stałej skali równej 4.

Dodaj zera wiodące, jeśli brakuje

Począwszy od wersji 5.6.0, opcja FormatDecimals jest dodawana do poziomów połączenia sqlsrv i instrukcji, co umożliwia użytkownikowi formatowanie ciągów dziesiętnych. Ta opcja oczekuje wartości logicznej (prawda lub fałsz) i wpływa tylko na formatowanie wartości dziesiętnych lub liczbowych w pobranych wynikach. Innymi słowy, opcja FormatDecimals nie ma wpływu na inne operacje, takie jak wstawianie lub aktualizacja.

Domyślnie FormatDecimals jest fałsz. Jeśli ustawiono wartość true, wiodące zera do ciągów dziesiętnych zostaną dodane dla dowolnej wartości dziesiętnej mniejszej niż 1.

Konfigurowanie liczby miejsc dziesiętnych

Po włączeniu opcji FormatDecimals, inna opcja DecimalPlaces pozwala użytkownikom konfigurować liczbę miejsc dziesiętnych podczas wyświetlania danych typu money i smallmoney. Akceptuje ona wartości całkowite w zakresie [0, 4], a zaokrąglanie może wystąpić po wyświetleniu. Jednak bazowe dane pieniężne pozostają takie same.

Obie opcje można ustawić na poziomie połączenia lub instrukcji, a ustawienie instrukcji zawsze zastępuje odpowiadające ustawienie połączenia. Należy pamiętać, że DecimalPlaces opcja dotyczy tylko danych pieniężnych i FormatDecimals musi być ustawiona na wartość true, aby DecimalPlaces zaczęły obowiązywać. W przeciwnym razie formatowanie jest wyłączone niezależnie od DecimalPlaces ustawienia.

Uwaga / Notatka

Ponieważ pola typu pieniężne lub małe wartości pieniężne mają skalę 4, ustawienie wartości DecimalPlaces na dowolną liczbę ujemną lub dowolną wartość większą niż 4 zostanie zignorowane. Nie zaleca się używania żadnych sformatowanych danych pieniężnych jako danych wejściowych do jakichkolwiek obliczeń.

Przykład — proste pobieranie

W poniższym przykładzie pokazano, jak używać nowych opcji w ramach prostego pobierania.

<?php
$username = 'myusername';
$password = '<password>';
$tableName = 'mytable';

$connectionInfo = array("UID" => $username, "PWD" => $password, "Database" => "myDB", "FormatDecimals" => true);  
$server = "myServer";  // 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);
?>

Przykład — formatowanie parametru wyjściowego

Jeśli pole dziesiętne lub liczbowe zostanie zwrócone jako parametr wyjściowy, zwracana wartość będzie traktowana jako zwykły ciąg varchar. Jeśli jednak określono SQLSRV_SQLTYPE_DECIMAL lub SQLSRV_SQLTYPE_NUMERIC, można ustawić FormatDecimals na "true", aby upewnić się, że nie brakuje zera wiodącego w ciągu liczbowym. Aby uzyskać więcej informacji, przeczytaj instrukcje: pobieranie parametrów wyjściowych przy użyciu sterownika SQLSRV.

W poniższym przykładzie pokazano, jak sformatować parametr wyjściowy procedury składowanej zwracającej wartość dziesiętną (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
}

Zobacz też

Formatowanie ciągów dziesiętnych i wartości pieniężnych (sterownik PDO_SQLSRV)

Pobieranie danych