222.9375 に対して 3 を取得しました。これREVERSE
は、文字列式を受け入れるためです。float を渡すことにより、SQL Server は float から varchar への暗黙的な変換を行う必要があります。
Books Online によると:
CAST と CONVERT (Transact-SQL)
float および real スタイル
expression が float または real の場合、style は次の表に示す値のいずれかになります。その他の値は 0 として処理されます。
値
0 (デフォルト)
出力
A 最大 6 桁。適切な場合は、科学表記で使用します。
上記の定義は、以下の例を使用して視覚化できます。
declare @a float = 222.9375, @b float = 12.34564, @c float = 1234564.123456
select convert(varchar, @a, 0) -- Returns 222.938 -- Notice only 6 digits are displayed
, convert(varchar, @b, 0) -- Returns 12.3456 -- Notice only 6 digits are displayed
, convert(varchar, @c, 0) -- Returns 1.23456e+006 -- Notice only 6 digits are displayed
float
float をデータ型として使用し続けると、文字列操作にキャストしvarchar
て実行しても、探している正確な数値を取得することは期待できません。
小数に割り当てる小数点以下の桁数 (スケール) がわからないため、単純にキャストすることさえできませんfloat
。decimal
または、データ型として decimal で開始すると、数値を宣言する必要があるため、数値の小数点以下の桁数が自動的にわかります。
例えば
declare @number decimal(19, 4) = 222.9375
select @number -- 222.9375
さらに一歩進めましょう。ある種の計算の後でスケール (小数点以下の桁数) を計算するには、以下の関数を使用して答えを得ることができます。
declare @newnumber decimal(19, 4) = 222.9375
select @newnumber * @newnumber -- Returns 49701.1289063
, sql_variant_property(@newnumber * @newnumber, 'scale') -- Returns 7
ただし、使用するデータ型を制御できない可能性が最も高いです。私が考えることができる 1 つの方法は、両方の使用法を組み合わせて、decimal
目的varchar
を達成することです。
declare @newnumber float = 222.9375
-- The first 6 columns are just the working steps, solution is in the last column.
select
@newnumber as 'original'
, cast(@newnumber as decimal(38, 18)) as 'decimal' -- Assuming all your numbers can fit in decimal(38, 18).
, cast(cast(@newnumber as decimal(38, 18)) as varchar(max)) as 'varchar'
, reverse(cast(cast(@newnumber as decimal(38, 18)) as varchar(max))) as 'reverse'
, cast(reverse(cast(cast(@newnumber as decimal(38, 18)) as varchar(max))) as decimal(38, 0)) as 'decimal'
, len(cast(reverse(cast(cast(@newnumber as decimal(38, 18)) as varchar(max))) as decimal(38, 0))) as 'len'
, case charindex('.', @newnumber)
when 0 then 0
else len(cast(reverse(cast(cast(@newnumber as decimal(38, 18)) as varchar(max))) as decimal(38, 0)))
end as 'All In One Step'