使用ISNULL插入时SQL Server抛出错误

问题描述 投票:0回答:4

我有这个问题

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值,NULL值替换为'0'。如果我将它与INSERT一起使用,ISNULL似乎不起作用。这里有什么问题?

编辑:我为假设错误与ISNULL有关而道歉。我现在明白它与语言环境有关。这个问题应该结束。

sql sql-server isnull nvarchar
4个回答
0
投票

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

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

0
投票

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

然后,您可以使用此逻辑并将其用作过滤掉所有不兼容的qty值的方法,使您能够快速完成插入操作,并且可以帮助您修复那些不安全的插入。

  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

-1
投票

试试这个 :

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

-1
投票

它工作得很好。 table1.qty中有NULL值,NULL值替换为'0'。如果我将它与INSERT一起使用,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

我想,我告诉了我的想法,你会明白的。

© www.soinside.com 2019 - 2024. All rights reserved.