Ошибка при вставке из внутреннего соединения и предложения EXCEPT SQL. преобразование не удалось при преобразовании значения varchar «Ошибка:» в тип данных int

у меня 3 стола

Tabledocs2 LogTable Tabledocs1

Я пытаюсь вставить в Tabledocs2 из Tabledocs1, а не из Tabledocs2.

LogTable — это промежуточная таблица, которая содержит столбцы Tabledocs1 и Tabledocs2.

Преобразование в случае не улавливает/обрабатывает эту ошибку. "преобразование не удалось при преобразовании значения varchar "Ошибка:" в тип данных int"

PRINT 'INSERTING FROM Tabledocs2 INTO Tabledocs1'
        INSERT INTO Tabledocs1 (Log_id, document_name , document_icon , document_body )
        SELECT  CONVERT(INT, CASE WHEN IsNumeric(CONVERT(VARCHAR(12),ID)) = 1 then CONVERT(VARCHAR(12), ID) else 0 End) as int  , document_name , document_icon , document_body 
        FROM LogTable
        INNER JOIN Tabledocs1 
        ON LogTable.detail_ID  = Tabledocs1.detail_ID 
        AND log_ID = @LogID 
        EXCEPT
        (SELECT Log_id, document_name , document_icon , document_body FROM Tabledocs2)--To Avoid duplicates

person steve_Starts_Coding    schedule 03.04.2017    source источник
comment
Отметьте свой вопрос с помощью базы данных, которую вы используете.   -  person Gordon Linoff    schedule 03.04.2017


Ответы (2)


Возможно, вам следует преобразовать в другом направлении?

INSERT INTO Tabledocs1 (Log_id, document_name , document_icon , document_body )
    SELECT ID, document_name , document_icon , document_body 
    FROM LogTable INNER JOIN
         Tabledocs1 
         ON LogTable.detail_ID  = Tabledocs1.detail_ID 
    WHERE log_ID = @LogID 
    EXCEPT
    (SELECT CAST(Log_id as VARCHAR(12)), document_name , document_icon , document_body
     FROM Tabledocs2
    );--To Avoid duplicates

Могут быть причины, такие как начальные нули, по которым вы хотели бы преобразовать в числовой формат. Однако 12 символов слишком длинны для целого числа, поэтому вам в любом случае понадобятся NUMERIC() или BIGINT.

person Gordon Linoff    schedule 03.04.2017
comment
Log_id — целое число, document_name — varchar(20), document_icon, document_body — двоичные. Я попробую с NUMERIC() - person steve_Starts_Coding; 03.04.2017

isnumeric() может ввести в заблуждение. В sql server 2012+ вместо этого используйте try_convert(). Он вернет null для неудачных преобразований вместо ошибки.

print 'INSERTING FROM Tabledocs2 INTO Tabledocs1'
insert into Tabledocs1 (
    Log_id
  , document_name
  , document_icon
  , document_body
 )
select 
    coalesce(try_convert(int,ID),0)
  , document_name
  , document_icon
  , document_body
from LogTable
  inner join Tabledocs1 
    on LogTable.detail_ID = Tabledocs1.detail_ID 
    and log_ID = @LogID
except
 select 
    Log_id
  , document_name
  , document_icon
  , document_body
 from Tabledocs2
person SqlZim    schedule 03.04.2017