2011-01-06 9 views
3

私はcsvからデータを挿入するために使用するストアドプロシージャを持っています。データそのものは種類、テスト、日付、お金のいくつかを組み合わせたものです。私は、たとえフォーマットが間違っていても、このデータが保存されることを保証する必要があります。したがって、それらをすべてvarcharsに保存しています。その後、データが検証され、チェックオフされると、適切なデータ型を持つ別のテーブルに移動されます。SQL Server 2008では、varcharパラメータをデータ型のお金に変換できるかどうかを確認するにはどうすればよいですか?

最初のテーブルに挿入すると、注意が必要な場合にその行にフラグ(ビット列)を設定するチェックを行いたいと思います。たとえば、お金の番号に文字が入っている場合、その行にフラグを立てて、余分なerrormsgフィールドに列名を追加する必要があります。次に、そのフラグを使用して、インターフェース内のユーザーが編集する必要があるフィールドを見つけて強調表示することができます。

日付パラメータは簡単だと思われますが、IF ISDATE(@mydate) = '0'を使用して、そのパラメータをvarcharからdatetimeに変換できるかどうかをテストできます。しかし、私はISMONEY()やそれと同等のものを見つけることができません。

誰かがvarcharの内容が合法的にお金に変換できるかどうかをテストするために何を呼び出すのか知っていますか?

EDIT: 私はまだそれをテストしていませんが、あなたはこのような機能を思い、何が

ちょうど上記のコードのテストが終了

CREATE FUNCTION CheckIsMoney 
(
    @chkCol varchar(512) 
) 
RETURNS bit 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @retVal bit 

SET @chkCol = REPLACE(@chkCol, '$', ''); 
SET @chkCol = REPLACE(@chkCol, ',', ''); 

IF (ISNUMERIC(@chkCOl + 'e0') = '1') 
    SET @retVal = '1' 
ELSE 
    SET @retVal = '0' 

RETURN @retVal 

END 
GO 

アップデートを?:、それは動作します!

+4

お金はかなり奇妙なデータ型ですたとえあなたが通貨を扱っているとしても、通常はそれを使用することをお勧めします。私は通常、適切な精度を選択して小数点型を推薦します。 (お金は小数点第4位を持ち、計算の各中間段階で丸めを実行します) –

+0

@Daimen_The_Unbeliever私は最終的な宛先列フィールドでそれに固執しています、私は恐れています。 – Patches

答えて

5

お金は実際には10進数ですので、あなたがこの方法をテスト

は、しかし箱から出しISNUMERICを使用しないでください:それは信頼できないのです。

ISNUMERIC(MyCOl + 'e0') 

注意、あなたは小数点以下6桁を持っているならば、それはお金に変換時に失われます

詳細理由と他の質問:How to determine the field value which can not convert to (decimal, float,int) in SQL Server

編集:

できます。これを使用しますあなたが望むなら1行にしてください

ISNUMERIC(REPLACE(REPLACE(@chkCOl, '$', ''), ',', '') + 'e0') 
+3

お金は通貨記号を受け入れることができるので、不当に0を返すことがあります。 '$ 4.10e0 'を選択し、CONVERT(金額、' $ 4.10 ')を選択します。 –

+0

同様に、千単位の区切り記号やその他の通貨記号が使用されます。 – onedaywhen

+0

@Damien_The_Unbeliever、@onedaywhen:ソースデータがどのように見えるかによって異なります。また、お金は実際に$ではないセパレータをサポートしていません。 – gbn

関連する問題