2017-02-08 5 views
0

すべての値がSQL Serverに読み込まれるスプレッドシートがあります。スプレッドシート内のフィールドの1つがお金になる場合があります。さて、すべてが正式に表示されるように、私は自分のtblにMoneyをDataTypeとしてフィールドを追加しました。SQL Serverの文字列とデータ型の問題

スプレッドシートから値を読み取ると、このような文字列として格納されます。"94259.4"。 SQL Serverに挿入すると、"94259.4000"のようになります。 SQL Serverの値を0から取り除く方法はありますか?DBから取得するときに問題が発生するのは、これらの2つの値は同じですが、両方が比較されるためです文字列として - 同じ値ではないと考えています。

値がこのように見える場合は、別の問題が予想されています... 94,259.40私は、期間の後に数値を2に制限していると思います。だから私はこの形式でサーバーから値を選択する94,259.40 - 私は大丈夫でなければなりません。

EDIT:

For Column = 1 To 34 
    Select Case Column 
     Case 1 'Field 1 
      If Not ([String].IsNullOrEmpty(CStr(excel.Cells(Row, Column).Value)) Or CStr(excel.Cells(Row, Column).Value) = "") Then 
    strField1 = CStr(excel.Cells(Row, Column).Value) 
      End If 
     Case 2 'Field 2 
     ' and so on 

私は、各フィールドを通過し、文字列として値を格納します。次に、それをDBと比較して、同じ値を持つレコードがあるかどうかを確認します。私の方法で唯一のフィールドは、マネーフィールドです。

+0

スプレッドシートをSQL Serverにロードするためにどのツールを使用していますか? – user3272686

+6

ずっと以前に学んだ醜いレッスン:決して、絶対に、決して、決して、eVeRでは、SQL ServerでMONEYデータ型を使用します。それは子犬を傷つけ、宇宙の不均衡を引き起こします。 –

+0

@ user3272686 - スプレッドシートを開き、値を取得するツールはありません。 – BobSki

答えて

1

あなたは文字列を比較するために)(書式を使用し、あるいは例えばフロートすることができます

Declare @YourTable table (value money) 
Insert Into @YourTable values 
(94259.4000), 
(94259.4500), 
(94259.0000) 

Select Original = value 
     ,AsFloat = cast(value as float) 
     ,Formatted = format(value,'0.####') 
From @YourTable 

戻り

Original AsFloat  Formatted 
94259.40 94259.4  94259.4 
94259.45 94259.45 94259.45 
94259.00 94259  94259 

私が(そのフォーマットに注意してください)、いくつかの素晴らしい機能を持っていますそれはその性能のために知られていません

0

コアの問題は、数値情報を表すために文字列データが使用されているため、「123.400」と「123.4」を比較して不一致が発生するという問題です。彼らが不一致でしょう。彼らは弦です。

解決策は、スプレッドシートの適切な形式(数値)でデータを保存し、「Money」データ型ではないデータベースの適切な形式を選択することです(シャルダーとオーバーオールを囲む大群のビジョンを挿入します)。さもなければ、2つの不適切に設計されたソリューションの間を行き来し、 "うまくいきません"というエッジケースがさらに増え、より特殊なケースが必要になると、タイプ間でコンバージョンの拡大が起こります...等々。

+0

フェア十分!私によって開発されていない、それが動作する必要があります。 – BobSki

+0

十分なバックアッチ:比較のためにテーブルからデータを取り出すために使用しているクエリを投稿できますか? –