Formatieren von Dezimalzeichenfolgen und Geldwerten (SQLSRV-Treiber)
Für maximale Genauigkeit werden Dezimal- oder numerische Typen immer als Zeichenfolgen mit der exakten Anzahl von Zeichen und Dezimalzeichen abgerufen. Wenn ein Wert geringer als 1 ist, fehlt die führende Null. Gleiches gilt für die Felder „money“ und „smallmoney“, da es sich um Dezimalfelder mit einer festen Anzahl von Dezimalzeichen (4) handelt.
Hinzufügen von fehlenden führenden Nullen
Ab Version 5.6.0 können Benutzer die Option FormatDecimals
auf sqlsrv-Verbindungs- und -Anweisungsebene verwenden, um Dezimalzeichenfolgen zu formatieren. Diese Option wird mit einem booleschen Wert (true oder false) verwendet und wirkt sich ausschließlich auf die Formatierung der Dezimal- oder numerischen Werte in den abgerufenen Ergebnissen aus. Mit anderen Worten, die Option FormatDecimals
hat keine Auswirkungen auf andere Vorgänge wie beispielsweise Einfüge- oder Aktualisierungsvorgänge.
Standardmäßig ist FormatDecimals
false. Bei Festlegung auf „true“ werden führende Nullen zu Dezimalzeichenfolgen hinzugefügt, wenn der Dezimalwert geringer als 1 ist.
Konfigurieren der Anzahl von Dezimalstellen
Wenn FormatDecimals
aktiviert ist, können Benutzer die Option DecimalPlaces
verwenden, um die Anzahl von Dezimalstellen bei money- und smallmoney-Daten zu konfigurieren. Für dieses Attribut können ganzzahlige Werte von 0-4 angegeben werden. Bei der Anzeige werden die Werte möglicherweise gerundet. Die zugrunde liegenden money-Daten werden jedoch nicht geändert.
Beide Optionen können auf Verbindungs- oder Anweisungsebene festgelegt werden. Die Anweisungseinstellung setzt stets die entsprechende Verbindungseinstellung außer Kraft. Beachten Sie, dass sich die Option DecimalPlaces
ausschließlich auf money-Daten auswirkt und FormatDecimals
auf „true“ festgelegt sein muss, damit DecimalPlaces
wirksam wird. Anderenfalls ist die Formatierung unabhängig von der Einstellung DecimalPlaces
deaktiviert.
Hinweis
Da die Felder „money“ und „smallmoney“ über 4 Dezimalzeichen verfügen, wird DecimalPlaces
ignoriert, wenn ein negativer Wert oder ein höherer Wert als 4 festgelegt wird. Es wird nicht empfohlen, formatierte money-Daten als Eingabe für Berechnungen zu verwenden.
Beispiel: einfaches Abrufen
Das folgende Beispiel zeigt, wie die neuen Optionen für einen einfachen Datenabruf verwendet werden.
<?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);
?>
Beispiel: Formatieren des Ausgabeparameters
Wenn ein Dezimal- oder numerisches Feld als Ausgabeparameter zurückgegeben wird, wird der zurückgegebene Wert als reguläre varchar-Zeichenfolge betrachtet. Bei Angabe von SQLSRV_SQLTYPE_DECIMAL oder SQLSRV_SQLTYPE_NUMERIC können Benutzer jedoch FormatDecimals
auf „true“ festlegen, um sicherzustellen, dass beim numerischen Zeichenfolgenwert keine führenden Nullen fehlen. Weitere Informationen finden Sie unter Gewusst wie: Abrufen von Eingabe-/Ausgabeparametern mit dem SQLSRV-Treiber.
Das folgende Beispiel zeigt, wie der Ausgabeparameter einer gespeicherten Prozedur formatiert wird, der einen Dezimalwert (8,4) zurückgibt.
$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
}
Weitere Informationen
Formatieren von Dezimalzeichenfolgen und Geldwerten (PDO_SQLSRV-Treiber)