Ошибка выбрасывания SQL-сервера при вставке с ISNULL - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть этот запрос

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 имеет тип decimal (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». ISNULL не работает, если я использовал его вместе с INSERT. В чем здесь проблема?

EDIT: Я прошу прощения за то, что предположил, что ошибка связана с ISNULL. Теперь я понимаю, что это как-то связано с языком. Этот вопрос должен быть закрыт.

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

Я думаю, что вам нужно изучить содержимое 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
0 голосов
/ 13 сентября 2018

Попробуйте это:

INSERT INTO dbo.finaltable (qty)
SELECT  ISNULL(table1.[qty], 0) as qty FROM dbo.sometable as table1
0 голосов
/ 13 сентября 2018

Работает отлично. В table1.qty есть значения NULL, а значения NULL заменяются на «0». ISNULL не работает, если я использовал его вместе с INSERT. В чем здесь проблема?

Из вашего заявления я бы хотел сказать что-то, что 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

Я думаю, я сказал то, что думал, и вы бы это поняли.

0 голосов
/ 13 сентября 2018

Похоже, ваш тип данных не является числовым для столбца qty, поэтому лучше изменить его на числовой, чем просто использовать запрос ниже

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