我有这个查询
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的qty列的类型为小数(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有关,我深表歉意。我现在了解到,这与语言环境有关。这个问题应该关闭。
答案 0 :(得分:0)
看来您的数据类型不是qty列的数字,因此最好将其更改为数字,然后仅使用以下查询
INSERT INTO dbo.finaltable (qty)
SELECT coalesce(table1.[qty], 0) from FROM dbo.sometable as table1
答案 1 :(得分:0)
我认为您需要检查table1.qty的内容,以了解为什么它不能转换为数字数据格式。我怀疑您需要删除其他一些非数字字符。我首先要做这样的事情,以确定发生了什么;如果try_cast无法将字段转换为数字格式,它将返回null值,这使您可以检查任何有问题的记录。
然后,您可以采用此逻辑并将其用作过滤掉所有不兼容的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
答案 2 :(得分:-1)
尝试一下:
INSERT INTO dbo.finaltable (qty)
SELECT ISNULL(table1.[qty], 0) as qty FROM dbo.sometable as table1
答案 3 :(得分:-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
我认为,我告诉了我的想法,您会明白的。