Вставить запрос — ошибка преобразования типа данных nvarchar в (null)

Я пытаюсь вставить данные из SQL Server на связанный сервер, но сталкиваюсь со следующей проблемой:

Msg 8114, Level 16, State 11, Line 1
Error converting data type nvarchar to (null).

Мой запрос:

INSERT piserver.piarchive..picomp2 
(tag, time, value, annotations)
SELECT cast(c.name as nvarchar) as name, convert(datetime, c.started_at) as started_at, c.value, cast(c.log as nvarchar) as log
FROM [database].[dbo].[table1] c
WHERE c.id = 206

В первых трех столбцах нет нулевых значений, но даже когда я удаляю последний столбец из запроса, я все равно получаю нулевую ошибку.

Типы данных picomp2: тег (WString(4000), не null) время (DateTime, не null) значение (Variant, null) аннотации (Variant, null)

Все типы данных таблицы 1 являются varchar, кроме значения, которое является числом с плавающей запятой.


person helloworld    schedule 23.02.2021    source источник
comment
Есть ли в таблице, которую вы пытаетесь вставить, больше столбцов, которые могут не допускать пустых значений, которых нет в вашем запросе?   -  person Brad    schedule 23.02.2021
comment
@Brad, да, есть столбец _index, но я считаю, что он создается автоматически, если не указан. Следующий запрос в том же формате работает в программе SQL command без него, но не в SQL Server. INSERT piserver.piarchive..picomp2 (tag, time, value, annotations) VALUES ('Test.Test1', '2021-02-20 04:48:06', 1.0, 'Manually created')   -  person helloworld    schedule 23.02.2021


Ответы (1)


В SQL Server всегда нужно указывать длину. Значение по умолчанию зависит от контекста. Неясно, какой должна быть длина, но вы, вероятно, можете просто положиться на неявное преобразование, чтобы сделать правильную вещь:

INSERT piserver.piarchive..picomp2 (tag, time, value, annotations)
    SELECT c.name, try_convert(datetime, c.started_at) as started_at, c.value, c.log 
    FROM [database].[dbo].[table1] c
    WHERE c.id = 206;

Я также рекомендую использовать try_convert() для datetime, если только вы не хотите, чтобы ошибки преобразования останавливали INSERT.

person Gordon Linoff    schedule 23.02.2021