簡體   English   中英

使用INSERT時SQL Server轉換失敗

[英]SQL Server Conversion Failure when using INSERT

我有一個充滿數據的現有表,可以使用

CREATE TABLE __EpisodeCost
(
    ActivityRecordID INT NOT NULL, 
    ActCstID NVARCHAR(15), 
    VolAmt FLOAT, 
    ActCnt FLOAT, 
    TotCst FLOAT, 
    ResCstID NVARCHAR(50)
);

這來自我無法控制的Feed,我想將其轉換為我自己的名為EpisodeCost的版本

CREATE TABLE EpisodeCostCtp
(
    ActivityRecordID INT NOT NULL, 
    ActCstID NVARCHAR(6), 
    ResCstID NVARCHAR(7), 
    ActCnt NVARCHAR(7), 
    TotCst DECIMAL(18, 8) 
);

現在,我遇到的問題是轉換。 我可以執行查詢

SELECT 
    ActivityRecordID, 
    Cast(ActCstID AS NVARCHAR(6)), 
    Cast(ResCstID AS NVARCHAR(7)), 
    Cast(LTRIM(STR(ActCnt, 10)) AS NVARCHAR(7)), 
    Cast(TotCst AS DECIMAL(18, 8)) 
FROM __EpisodeCostCtp;

然而,當我嘗試執行時,它會提供數據

INSERT INTO EpisodeCostCtp 
    (
        ActivityRecordID, 
        ActCstID, 
        ResCstID, 
        ActCnt, 
        TotCst 
    ) 
SELECT 
    ActivityRecordID, 
    Cast(ActCstID AS NVARCHAR(6)), 
    Cast(ResCstID AS NVARCHAR(7)), 
    Cast(LTRIM(STR(ActCnt, 10)) AS NVARCHAR(7)), 
    Cast(TotCst AS DECIMAL(18, 8)) 
FROM __EpisodeCostCtp;

我明白了

消息8115,級別16,狀態8,行102算術溢出錯誤將數字轉換為數據類型數字。 該語句已終止。

我為什么SELECT使用相關的石膏,但當時無法INSERT到目標表?


編輯。 我還是不知道這里發生了什么。

根據Serg的建議,我試圖找到有問題的記錄但查詢

SELECT 
    ActivityRecordID, 
    Cast(ActCstID AS NVARCHAR(6)), 
    Cast(ResCstID AS NVARCHAR(7)), 
    Cast(LTRIM(STR(ActCnt, 10)) AS NVARCHAR(7)), 
    Cast(TotCst AS DECIMAL(18, 8))      
FROM __EpisodeCostCtp
WHERE TotCst > 9.999999999999999e9;

返回零記錄。 更改為9.999999999999999e8,轉換/轉換發生錯誤。 我有scince改變INSERT查詢使用DECIMAL(36, 18) ,現在插入成功,但我仍然沒有更聰明。 很明顯我在演員表上達到了限制,但為什么SELECT工作而INSERT失敗,我仍然不知道。

這可能是您想要嘗試的溢出問題

SET ARITHABORT OFF

來自https://docs.microsoft.com/en-us/sql/t-sql/statements/insert-transact-sql

當INSERT語句遇到表達式求值期間發生的算術錯誤(溢出,除以零或域錯誤)時,數據庫引擎會處理這些錯誤,就好像SET ARITHABORT設置為ON一樣。 批處理已停止,並返回錯誤消息。 在表達式評估期間,當SET ARITHABORT和SET ANSI_WARNINGS為OFF時,如果INSERT,DELETE或UPDATE語句遇到算術錯誤,溢出,被零除或域錯誤,SQL Server將插入或更新NULL值。 如果目標列不可為空,則插入或更新操作將失敗,並且用戶將收到錯誤。

我相信在你的TotCst列中的值大於DECIMAL(18,8)。 如果目標類型不夠大,則SQL SERVER的2008版本將獲得舍入結果。 但它無法插入,因為該表僅接受精確值。

您可以在SQL SERVER 2012上看到我的兩個查詢的結果:

 DECLARE @float FLOAT 
 SET @float = 12345678911.12
 SELECT CAST(@float AS decimal(18,8))

結果:將float轉換為數字數據類型時發生算術溢出錯誤。

與DECIMAL(19,8)相同的查詢:

 DECLARE @float FLOAT 
 SET @float = 12345678911.12
 SELECT CAST(@float AS decimal(19,8))

結果:12345678911.12000100

編輯:檢查您的查詢工具是否獲取所有記錄。 如果沒有,可能在其余記錄中有一些值大於DECIMAL(18.8)

要查找導致問題的行,請嘗試

SELECT *       
FROM __EpisodeCostCtp
WHERE TotCst > 9.999999999999999e9;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM