我试图将数据从包含varchar列的表移动到带有数字列的表。下面是列中值的示例,其中有时会使用句点来表示缺失值。
Column1
0.00
4.80
.
.
0.00
.
0.00
.
'将数据类型varchar转换为数字时出错。'到达期间时弹出。如何处理句点(删除它们或将它们更改为0.00)以便我可以继续将数据复制到新表中?
供参考,以下是我正在使用的代码:
INSERT INTO [CORE]
[NumberDone]
,[Charges]
SELECT
LEFT([Column0],8)
,LEFT([Column1],8)
FROM [TempTbl];
答案 0 :(得分:2)
您可以使用nullif()
将'.'
变为null
:
insert into [core] ([NumberDone], [Charges])
select
left(nullif([Column0], '.'), 8)
, left(nullif([Column1], '.'), 8)
from [TempTbl];
rextester演示:http://rextester.com/DIVNJ65404
create table TempTbl ([Column1] varchar(50));
insert into TempTbl values
('0.00'),('4.80'),('.'),('.')
,('0.00'),('.'),('0.00'),('.');
select Column1 = left(nullif([Column1], '.'), 8)
from [TempTbl];
返回:
+---------+
| Column1 |
+---------+
| 0.00 |
| 4.80 |
| NULL |
| NULL |
| 0.00 |
| NULL |
| 0.00 |
| NULL |
+---------+
您可以将其包含在isnull()
或coalesce()
中,以将null
转换为0
。
insert into [core] ([NumberDone], [Charges])
select
isnull(left(nullif([Column0], '.'), 8),0)
, isnull(left(nullif([Column1], '.'), 8),0)
from [TempTbl];
答案 1 :(得分:0)
使用类似
的内容case when charges='.' then 0 else cast(charges as double precision) end
答案 2 :(得分:0)
如果是2012+,Try_Convert()可能会有所帮助。 Try_Convert()不仅会捕获单个小数,还会捕获任何其他意外的字符串。
示例强>
Declare @YourTable Table ([Column1] varchar(50))
Insert Into @YourTable Values
('0.00')
,('4.80')
,('.')
,('.')
,('0.00')
,('.')
,('0.00')
,('.')
Select Try_Convert(decimal(10,2),Column1)
from @YourTable
<强>返回强>
0.00
4.80
NULL
NULL
0.00
NULL
0.00
NULL
注意:如果您更喜欢零,IsNull(Try_Convert(decimal(10,2),Column1),0)
所以,对于实际的插入
insert into [core] ([NumberDone], [Charges])
select try_convert(decimal(10,2),Column0)
, try_convert(decimal(10,2),Column1)
from [TempTbl];