我正在将数据从CSV文件加载到staging表(使用BULK INSERT),其中所有列类型都是NVARCHAR(100)。
这个想法是然后插入数据到生产表,同时改变数据类型。
当尝试将包含数值的列从NVARCHAR转换为DECIMAL时,所有小数都消失了。
创建并插入从登台表到生产表:
DROP TABLE IF EXISTS [dbo].[factFinanzbuchhaltung]
GO
CREATE TABLE [dbo].[factFinanzbuchhaltung]
(
Wert DECIMAL
)
GO
INSERT INTO [dbo].[factFinanzbuchhaltung]
SELECT CONVERT(DECIMAL(25, 2), ROUND(Wert,2))
FROM [dbo].[Stage_factFinanzbuchhaltung]
转换前后数据的样子
我做错了什么?我觉得我尝试了CONVERT, CAST和小数的组合。
Decimal是一个定点数,它具有声明的小数位数(也称为刻度)。当您将列声明为类型DECIMAL
时,您将得到一个具有精度18和比例0的小数(源)。换句话说,它只能存储整数值(整数),并删除小数点后的任何内容。
您需要声明所需的小数数,例如DECIMAL(18, 2)
为两个小数。快速查看您的屏幕截图表明您需要DECIMAL(18, 8)
。唯一的其他选择是使用FLOAT
(双精度),但这可能导致精度的损失。在某些数据库系统中,您也有DECFLOAT
(十进制浮点数)类型,但SQL Server没有此类型。