SQL - 插入 - 转换数据类型
SQL - Insert Into - Convert Datatype
我的table由以下字段组成:
IDTemp int NO NULL
Nr_ nvarchar(50) NULL
Description nvarchar(50) NULL
[Description 2] nvarchar(50) NULL
Price money NULL
现在我想从另一个数据库向 table 中插入一些值,不幸的是,来自另一个数据库的价格值存储为 nvarchar
而不是货币值。
它看起来有点像这样:49.0000000000
如果我将此值插入我的货币字段,它会保持为空。
我的问题是,我如何使用 INSERT INTO 并转换我的价格值,以便它进入我的货币字段并且没有 10 个零?
INSERT INTO TempSaveArticle (Nr_, Description, [Description 2], Price)
VALUES (123456789, Yarn, blue, '49.0000000000')
提前感谢您的帮助
使用CONVERT().
INSERT INTO TempSaveArticle (Nr_, Description, [Description 2], Price)
VALUES (123456789, Yarn, blue, CONVERT(MONEY, 49.0000000000))
理想情况下,您希望更动态地执行此操作。
INSERT INTO TempSaveArticle (Nr_, Description, [Description 2], Price)
SELECT myTable.*
FROM myTable
WHERE myTable.ID = 123 OR <<some other conditions>>
MONEY is effectively a DECIMAL.
您可以将其 CAST() 或 CONVERT() 转换为十进制 <--> 货币。我知道的唯一区别是默认情况下使用计算机的语言设置显示 MONEY。但在我看来,不要使用 MONEY,坚持使用 DECIMALS 并使用 FORMAT() 以您想要的方式显示它。有关此论点的更多信息 here.
我们必须使用转换或转换,这直接适用于数据类型 CHAR、VARCHAR、NCHAR 和 NVARCHAR。
SQL 服务器不会直接从 TEXT 转换为货币。如果数据类型是 TEXT,我们必须首先转换为 varchar(例如),然后再次转换为 money。
注意:在某些国家/地区,例如我离开的法国,使用逗号代替点是标准做法。如果有这种可能性,我们需要先使用 REPLACE 否则我们会得到一个错误。
create table mon (
monet text, monev nvarchar(20),
monetm money, monevm money);
GO
✓
insert into mon (monet, monev) values('49.0000000000','49.0000000000');
GO
1 行受影响
select * from mon;
GO
monet | monev | monetm | monevm
:------------ | :------------ | -----: | -----:
49.0000000000 | 49.0000000000 | null | null
update mon set monevm = cast(monev as decimal(20,10))from mon;
GO
1 行受影响
update mon set monetm = cast(monet as decimal(20,10))from mon;
GO
Msg 529 Level 16 State 2 Line 1
不允许从数据类型文本到十进制的显式转换。
update mon set monetm = cast(
cast(monet as varchar)
as decimal(20,10))from mon;
GO
1 行受影响
select * from mon;
GO
monet | monev | monetm | monevm
:------------ | :------------ | ------: | ------:
49.0000000000 | 49.0000000000 | 49.0000 | 49.0000
db<>fiddle here
使用 CAST 正确转换
SELECT CAST ('49.0000000000' as numeric(10,2));
输出:
49.00
我的table由以下字段组成:
IDTemp int NO NULL
Nr_ nvarchar(50) NULL
Description nvarchar(50) NULL
[Description 2] nvarchar(50) NULL
Price money NULL
现在我想从另一个数据库向 table 中插入一些值,不幸的是,来自另一个数据库的价格值存储为 nvarchar
而不是货币值。
它看起来有点像这样:49.0000000000
如果我将此值插入我的货币字段,它会保持为空。 我的问题是,我如何使用 INSERT INTO 并转换我的价格值,以便它进入我的货币字段并且没有 10 个零?
INSERT INTO TempSaveArticle (Nr_, Description, [Description 2], Price)
VALUES (123456789, Yarn, blue, '49.0000000000')
提前感谢您的帮助
使用CONVERT().
INSERT INTO TempSaveArticle (Nr_, Description, [Description 2], Price)
VALUES (123456789, Yarn, blue, CONVERT(MONEY, 49.0000000000))
理想情况下,您希望更动态地执行此操作。
INSERT INTO TempSaveArticle (Nr_, Description, [Description 2], Price)
SELECT myTable.*
FROM myTable
WHERE myTable.ID = 123 OR <<some other conditions>>
MONEY is effectively a DECIMAL.
您可以将其 CAST() 或 CONVERT() 转换为十进制 <--> 货币。我知道的唯一区别是默认情况下使用计算机的语言设置显示 MONEY。但在我看来,不要使用 MONEY,坚持使用 DECIMALS 并使用 FORMAT() 以您想要的方式显示它。有关此论点的更多信息 here.
我们必须使用转换或转换,这直接适用于数据类型 CHAR、VARCHAR、NCHAR 和 NVARCHAR。
SQL 服务器不会直接从 TEXT 转换为货币。如果数据类型是 TEXT,我们必须首先转换为 varchar(例如),然后再次转换为 money。
注意:在某些国家/地区,例如我离开的法国,使用逗号代替点是标准做法。如果有这种可能性,我们需要先使用 REPLACE 否则我们会得到一个错误。
create table mon ( monet text, monev nvarchar(20), monetm money, monevm money); GO
✓
insert into mon (monet, monev) values('49.0000000000','49.0000000000'); GO
1 行受影响
select * from mon; GO
monet | monev | monetm | monevm :------------ | :------------ | -----: | -----: 49.0000000000 | 49.0000000000 | null | null
update mon set monevm = cast(monev as decimal(20,10))from mon; GO
1 行受影响
update mon set monetm = cast(monet as decimal(20,10))from mon; GO
Msg 529 Level 16 State 2 Line 1
不允许从数据类型文本到十进制的显式转换。
update mon set monetm = cast( cast(monet as varchar) as decimal(20,10))from mon; GO
1 行受影响
select * from mon; GO
monet | monev | monetm | monevm :------------ | :------------ | ------: | ------: 49.0000000000 | 49.0000000000 | 49.0000 | 49.0000
db<>fiddle here
使用 CAST 正确转换
SELECT CAST ('49.0000000000' as numeric(10,2));
输出:
49.00