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