2011-08-16 3 views
1

У меня есть текущий запрос в базе данных MS Access, который использует функцию Format() для преобразования числа (длинное целое число) в строку.Функция SQL Server Format()

Таблица была переработана и перенесена на SQL-сервер. Поле, которое мне нужно преобразовать, не является денежным полем, которое нужно отбросить после периода и преобразовать его в строку с определенным количеством символов.

Образец данных:

Amount 
228.00000 
1896.00000 
6411.00000 
317.00000 
4830.00000 
898.00000 
1778.00000 
1308.00000 
45139.00000 
424.00000 

Текущий MS Access запрос:

SELECT Format(CallAmt],"000000000000000") AS Amount 
FROM Fed 

Новый запрос:

SELECT Convert(varchar(15), FedAmount) 
FROM Fed.SM_T_Call 

Я хотел бы мой окончательный продукт, чтобы выглядеть следующим образом:

Amount 
000000000000228 
000000000001896 
000000000006411 
000000000000317 
000000000004830 
000000000000898 
000000000001778 
000000000001308 
000000000045139 
000000000000424 

Я не знаю, как отбросить все после периода и добавить дополнительные нули к моему результату. Может ли кто-нибудь помочь?

+0

Что тип данных FedAmount в SQL Server? Вы сказали, что это не денежное поле, что это в SQL Server после его перемещения. – kd7

+1

Это поможет, если вы отредактируете свой вопрос и покажете, как вы хотите, чтобы конечный результат выглядел. –

+0

yep, требуется окончательный выход. Не все из нас беспокоят/используют VBA. – gbn

ответ

6

Вы можете использовать :

  • CAST в десятичную иметь фиксированное количество знаков после запятой
  • Использование STR направо оправдает
  • Использование RIGHT('000000000000000' + CAST(MyNumber AS varchar(15)), 15) иметь ведущие нули

Или все вышеперечисленное: но мы не «знаю, что вывод, который вы хотите ...

Edit, после обновления

RIGHT('000000000000000' + CAST(CAST(Amount AS int) AS varchar(15)), 15) 

Редакция, октябрь 2011

SQL Server 2012 (Denali) будет иметь функцию форматирования.

Edit, после комментария по onedaywhen

DECLARE @len tinyint; 
SET @len = 15; 
RIGHT(REPLICATE('0', @len) + CAST(CAST(Amount AS int) AS varchar(255)), @len) 
+0

большое вам спасибо. Я понятия не имел, как я собираюсь это понять. Извините еще раз за то, что вы не включили данные образца. – Taryn

+0

Использование 'REPLICATE ('0', 15)' сделает ваш код более удобным для чтения. – onedaywhen

+0

@onedaywhen: True. В реальной жизни я бы, вероятно, обернул его в UDF и имел длину как параметр ... – gbn

0
select Cast(Cast(fedamount as int), as varchar(15)) 
from Fed.SM_T_Call 

Возможно ли работать?

0
SELECT CAST(CAST(FLOOR(FedAmont) AS INT) AS VARCHAR(40)) + '.00' 
0

Вы можете использовать десятичный тип данных:

declare @var decimal(15,6) 
set @var = 228564.12345678 

И затем, если вы хотите, чтобы это было VARCHAR после этого:

select convert(varchar(15),@var) 

Или в избранном, это может выглядеть например:

select 
    [field1] as OldValue, 
    convert(decimal(15,6),[field1]) as NewValue 
from 
    myTable 
0

@ gbn'd ответ хороший один для SQL Server и использует запатентованную ФУНКЦИИ RIGHT() и REPLICATE().

Отметив, что вам уже пришлось переносить этот один раз, следующая версия может быть более переносимой, поскольку она использует стандартные функции SQL. Обратите внимание, что оператор конкатенации строк в стандартном SQL равен ||, тогда как SQL Server использует + для того же (и MS по-прежнему утверждает, что он совместим, идите по фигуре). Однако предлагаемый код еще десятки высоко по шкале портативности, потому что преобразование `|| в + тривиален:

REVERSE(CAST(REVERSE(CAST(CAST(Amount AS INTEGER) AS VARCHAR(15))) 
    + '000000000000000' AS CHAR(15)))