[英]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.