2017-05-04 51 views
0

嗨,大家好,這是我的主要塊我一直在嘗試很多,但沒有成功
在數據庫中有長度爲9的數據[AH_TRAN_CV]爲Integer。我想用varchar和9個char和2個小數。

我想這整個代碼可能是錯誤的,因爲我沒有知識,只是使用互聯網來得到這裏..樣品就像如何在MS SQL Server 2014中將EBCDIC區位十進制轉換爲小數?

 
123D is +1234 
678{ is +6780 
468K is -4682 
Digit Positive Negative 
0   {  } 
1   A  J 
2   B  K 
3   C  L 
4   D  M 
5   E  N 
6   F  O 
7   G  P 
8   H  Q 
9   I  R 
所以善良的幫助。以下僅僅是代碼
代碼的一部分:

Case When (substring(convert(varchar,[AH_TRAN_CV] * 0.0000001), 9, 1) = '4' 
     and ([AH_TRAN_CV] >= 0.00)) 
     Then concat (substring(convert(varchar,[AH_TRAN_CV]*0.0000001), 3, 8), 'D') 
end [AH_TRAN_CV] 
+0

**我想123D轉換爲+ 1234 ** –

+0

編輯你的問題,不要添加你真正想要的作爲評論。 –

+0

你不*轉換任何東西。您正試圖將EBCDIC區域字符串解析爲數字。你不能用一個簡單的字符替換來做到這一點。除了IBM大型機之外,這種東西沒有內置功能? –

回答

0

這種編碼是不是可以解析爲數字的數字格式。這是僅在大型機中發現的EBCDIC zoned decimal encoding

您可以創建拆分字符串,並根據輸入字符串適當的符號和最後一位的功能,如:

create function ZonedToNumber(@somenum varchar(20)) 
returns varchar(20) 
as 
begin 

declare @c char = right(@somenum,1); 

declare @digit char = case when @c between 'A' and 'I' then (ascii(@c) -64) 
         when @c between 'J' and 'R' then (ascii(@c) -73) 
         when @c in ('{','}') then 0 
         else null end 

declare @sign char = case when @c between 'A' and 'I' or @c = '{' then '+' 
        when @c between 'J' and 'R' or @c = '}' then '-' 
        else null end 

RETURN CONCAT(@sign,left(@somenum,len(@somenum)-1) ,@digit) 
end 

而是執行任何聰明的運算,函數使用CASE和減去基地每個案例的ASCII值生成最後一位數字和符號。

您可以將該函數應用於分區十進制字符串以將其轉換爲實際數字,例如:SELECT dbo.ZonedToNumber('1234')將返回=1234。您還可以在查詢中使用它:

declare @t table (num varchar(20)) 
insert into @t 
values 
('123D'), 
('123K'), 
('123{'), 
('123}') 

select cast(dbo.ZonedToNumber(num) as int) 
from @t x 

這將返回:

1234 
-1232 
1230 
-1230 

你應該使用這個功能只能在加載數據時劃小數轉換爲實際的數字。幾乎沒有人(外部大型機)再也使用這種格式。

相關問題