使用 ISNULL 插入时 SQL 服务器抛出错误



我有这个查询

INSERT INTO dbo.finaltable (qty)
SELECT REPLACE(REPLACE(ISNULL(table1.[qty], '0'), CHAR(13), ''), CHAR(10), 
'') as qty FROM dbo.sometable as table1

dbo.finaltable 的"数量"列类型为十进制 (18,4(

当我运行它时,它会抛出错误

Arithmetic overflow error converting nvarchar to data type numeric.

但是当我只是跑的时候

SELECT REPLACE(REPLACE(ISNULL(table1.[qty], '0'), CHAR(13), ''), CHAR(10), 
'') as qty FROM dbo.sometable as table1

它正在完美地工作。table1.qty 中有空值,NULL 值替换为"0"。如果我将 ISNULL 与插入一起使用,它似乎不起作用。这里有什么问题?

编辑: 我很抱歉假设错误与ISNULL有关。我现在明白它与区域设置有关。这个问题应该结束了。

我认为您需要检查table1.qty的内容,以了解为什么它不能转换为数字数据格式。我怀疑您需要删除其他一些非数字字符。我会先做这样的事情来确定还发生了什么;当try_cast无法将字段转换为数字格式时,它将返回 null 值,这允许您检查任何有问题的记录。

然后,您可以采用此逻辑并将其用作过滤掉所有不兼容的数量值的方法,使您能够快速完成易于完成的插入,并让您修复不平静的插入。

SELECT 
REPLACE(REPLACE(ISNULL(table1.[qty], '0'), CHAR(13), ''), CHAR(10), '') as replaced_values 
, table1.qty  
FROM table1
WHERE
try_cast(REPLACE(REPLACE(ISNULL(table1.[qty], '0'), CHAR(13), ''), CHAR(10)), '') as numeric(18,4))
is null

似乎您的数据类型不是 qty 列的数字,因此最好将其更改为数字,然后只需使用以下查询

INSERT INTO dbo.finaltable (qty)
SELECT coalesce(table1.[qty], 0) from FROM dbo.sometable as table1

试试这个:

INSERT INTO dbo.finaltable (qty)
SELECT  ISNULL(table1.[qty], 0) as qty FROM dbo.sometable as table1

它工作得很好。table1.qty 中有空值,NULL 值替换为"0"。如果我将 ISNULL 与插入一起使用,它似乎不起作用。这里有什么问题?

从你的陈述中,我想说一些事情,关于select陈述convert()replace(replace(isnull(..)..)..)的结果.如果它抛出错误,那么你将假设错误发生在INSERT

SELECT 
convert(
decimal(18, 4)
, REPLACE(REPLACE(ISNULL(table1.[qty], '0'), CHAR(13), ''), CHAR(10), 
'') 
) as qty 
FROM dbo.sometable as table1

我想,我说出了我的想法,你会明白的。

相关内容

最新更新