2016-04-15 13 views
0

で記号で数値にvarchar型に変換:SQL Serverは:私はこのようなvarchar型の値持って終了

SELECT CAST(@TestConvert AS DECIMAL(18, 4)) 

DECLARE @TestConvert VARCHAR(MAX) = '1234.94-' 

を私はdecimal(5,2)にこの値を変換したいことは、この好き問題は値の最後の記号です。

記号は、このように先頭にある場合:

DECLARE @TestConvert VARCHAR(MAX) = '1234.94-' 

私は何の問題もありません。このための解決策または回避策はありますか?

ありがとうございました。

+4

注: '進(5,2)' ** '-1234.94'のあなたの価値を保持するのに十分な大きさではないでしょう - それは**のみ** 2 *の合計5桁、を可能にします*小数点の後に(したがって、小数点の前に** 3 **)。あなたはこの値を保持するために ''進(6,2)**少なくとも**必要があるでしょう! –

+2

'PARSE( '123.94-' 小数(6,2)は次のように)' – adrianm

答えて

3

SQL2012以降では、PARSEがこれを処理します。 (これはあなたのために動作しない場合は私のテストボックスは2016ので、謝罪を実行している)

DECLARE @TestConvert VARCHAR(MAX) = '1234.94-' 
SELECT PARSE(@TestConvert AS DECIMAL(18, 4)) AS Converted 

Converted 
--------------------------------------- 
-1234.9400 

(1 row(s) affected) 

PARSEドキュメントhttps://msdn.microsoft.com/en-us/library/hh213316(v=sql.110).aspx

および関連

TRY_PARSEhttps://msdn.microsoft.com/en-us/library/hh213126(v=sql.110).aspx

1

これを試してみてください:

DECLARE @TestConvert VARCHAR(MAX) = '1234.94-' 
    SELECT CAST((RIGHT(@TestConvert,1)+LEFT(@TestConvert,LEN(@TestConvert)-1)) as DECIMAL(18,4)) 

この答えは想定して「 - 」記号は、必ず最後になります

時々-1234.94として書式設定値があるなら、あなたは何ができる:

DECLARE @TestConvert VARCHAR(MAX) = '1234.94-' 
SELECT 
CASE WHEN ISNUMERIC(@TestConvert)=1 THEN 
CAST(@TestConvert AS Decimal(18,4)) 
ELSE 
CAST((RIGHT(@TestConvert,1)+LEFT(@TestConvert,LEN(@TestConvert)-1)) as DECIMAL(18,4)) 
END 
+0

だから、 ' '-1234.94''期待されていませんか?少し安全ではないようだ。 – jarlh

+0

私は、最新の編集がそれを扱うべきだと思います – rmon2852

1
DECLARE @TestConvert VARCHAR(MAX) = '1234.94-' 

if(charindex('-', @TestConvert) = len(@TestConvert)) 
begin 
    set @TestConvert = replace(@TestConvert, '-', '') 
    select 0 - cast(@TestConvert as DECIMAL(6, 2)) 
end 
else 
    select cast(@TestConvert as DECIMAL(6, 2)) 
1

あなたは

を試すことができます
declare @val as nvarchar(max)='5656.99-' 

select case when CHARINDEX('+',reverse(@val))=1 or CHARINDEX('-',reverse(@val))=1 then 
CAST(REVERSE(STUFF(REVERSE(@val),1,1,'')) as decimal(18,2)) else cast(@val as decimal(18,2)) end 

は、それがいかなる場合に値を変換していただければ幸いです。

関連する問題