2017-01-07 3 views
1

Я знаю, что bigint должен неявно преобразовывать в float, но это не похоже.Как преобразовать bigint в float

колонка Таблица быть обновлена:

[GBUsed] [float] NOT NULL, 

Пример данных в этом столбце:

430,5

Логика: Я суммированием 2 BigInt колонны вместе и деления на 1024. Пример 1 из строки - я получаю: 1545

Я обновляю столбец GBUsed, который определяется как float, но он не преобразуется. Я все еще получаю 1545.

Хранимую процедуру:

CREATE PROCEDURE [dbo].[RecalculateBandwidthUsage] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @RowCount int, 
      @Rc int, 
      @Message varchar(max), 
      @CurrentDateTime datetime 

    CREATE TABLE #Temp 
    (
     SwitchID int, 
     PortIndex int, 
     SwitchIP varchar(50), 
     GBUsed bigint 
    ) 

    SET @CurrentDateTime = GETDATE() 

    -- FOR TESTING: 
    BEGIN TRANSACTION 
     INSERT #Temp (SwitchID, PortIndex, SwitchIP, GBUsed) 
      SELECT 
       c.SwitchID, c.PortIndex, 
       s.SwitchIP, 
       SUM ((c.BandwidthIn + c.BandwidthOut)/1024) AS GBUsed  -- converting to gigabytes 
      FROM 
       dbo.BandwidthLogCalculatedTest6 c 
      INNER JOIN 
       Switch s ON (c.SwitchID = s.SwitchID) 
      WHERE 
       (c.StartDate < DATEADD(HOUR, -1, @CurrentDateTime) 
       AND c.EntryType = 'Second') 
      GROUP BY 
       c.SwitchID, c.PortIndex, s.SwitchIP 
      ORDER BY 
       c.PortIndex 

    SELECT 
     @Rc = @@ERROR, 
     @RowCount = @@ROWCOUNT  

    IF @Rc <> 0 
    BEGIN 
     SELECT @Message = 'Critical Error - procedure RecalculateBandwidthUsage - on select. Return code: ' + Cast(@Rc as varchar) 
     RAISERROR (@Message, 16, 1) 
    END 

    -- FOR TESTING: 
    SELECT 'Temp table ' 

    SELECT * 
    FROM #temp 
    ORDER BY PortIndex 

    IF @RowCount > 0 
    BEGIN 
     -- FOR TESTING: 
     SELECT 'Before update ' 

     SELECT b.SwitchIP, b.SwitchPort, b.GBUsed 
     FROM dbo.Bandwidth b 
     INNER JOIN #temp t ON (b.SwitchIP = t.SwitchIP AND b.SwitchPort = t.PortIndex) 
     ORDER BY b.SwitchPort 

     -- Update. 
     UPDATE dbo.Bandwidth 
     SET GBUsed = CONVERT(float, t.Gbused) 
     FROM #Temp t 
     WHERE (Bandwidth.SwitchIP = t.SwitchIP AND Bandwidth.SwitchPort = t.PortIndex) 

     SELECT @Rc = @@ERROR 

     IF @Rc <> 0 
     BEGIN 
      SELECT @Message = 'Critical Error - procedure RecalculateBandwidthUsage - on Bandwidth update. Return code: ' + Cast(@Rc as varchar) 
      RAISERROR (@Message, 16, 1) 
     END 

     -- FOR TESTING: 
     SELECT 'After update ' 

     SELECT b.SwitchIP, b.SwitchPort, b.GBUsed 
     FROM dbo.Bandwidth b 
     INNER JOIN #temp t ON (b.SwitchIP = t.SwitchIP AND b.SwitchPort = t.PortIndex) 
     ORDER BY b.SwitchPort 
    END 

    ROLLBACK TRANSACTION 
END 

ответ

1

вы делаете целого деления - так значит, ваш результат будет также целым (или BIGINT).

Вы должны использовать этот код, чтобы получить дробные значения:

SUM ((c.BandwidthIn + c.BandwidthOut)/1024.0) AS GBUsed 

разделив на 1024.0 (вместо того, чтобы просто 1024) убеждается использовать дробные значения

+0

marc_s ... Я должен был измените мой temp table colum на: GBUsed float, а затем мою вставку: CONVERT (десятичный (18,2), SUM (c.BandwidthIn + c.BandwidthOut)/1024.0) AS GBUsed, чтобы получить значение float, которое я ожидаю. – user3020047

Смежные вопросы