Вставка отдельной записи в db.table приводит к неявной ошибке преобразования в SQL Server - PullRequest
0 голосов
/ 07 января 2020

У меня есть требование, когда мне нужно вставить новые записи, найденные в записи, в основную таблицу и сопоставить идентификатор идентификатора с основной таблицей.

. Для примера рассмотрим приведенный ниже пример:

-- Insert into Category Master if not exists  
INSERT INTO tblCategoryMaster (Category,
                               CreatedBy,
                               CreatedDate,
                               UpdatedBy,
                               UpdatedDate)
SELECT DISTINCT
       (category),
       SERVERPROPERTY('MACHINENAME'),
       GETDATE(),
       SERVERPROPERTY('MACHINENAME'),
       GETDATE()
FROM tblTempDataStaging stg
WHERE category IS NOT NULL
  AND NOT EXISTS (SELECT 1 FROM tblCategoryMaster ctg WHERE ctg.Category = stg.category);

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

Сервер не позволяет мне вставить, из-за чего появляется ошибка: 1008 *

Сообщение 257, Уровень 16, Состояние 3, Строка 39 Неявное преобразование из типа данных sql_variant в nvarchar (max) не допускается. Используйте функцию CONVERT для выполнения этого запроса.

Тип данных промежуточной таблицы NVARCHAR(MAX) для соответствующих полей, кроме даты и времени для полей даты

Попытка с использованием CONVERT метод, но я не уверен, как мы используем его с DISTINCT на картинке

Можете ли вы предложить, как мне решить эту проблему?

1 Ответ

2 голосов
/ 07 января 2020

Ошибка говорит о проблеме: SERVERPROPERTY('MACHINENAME') возвращает тип данных sql_variant:

SELECT system_type_name
FROM sys.dm_exec_describe_first_result_set(N'SELECT SERVERPROPERTY(''MACHINENAME'') AS MachineName',NULL,NULL);

Базовым типом данных является nvarchar (хотя это, конечно, не будет 2 ГБ памяти для имени машины!) как можно увидеть здесь:

SELECT SQL_VARIANT_PROPERTY(SERVERPROPERTY('MACHINENAME'),'Basetype')

Вам необходимо явно преобразовать значение. Например:

CONVERT(nvarchar(256),SERVERPROPERTY('MACHINENAME'))

Я предлагаю вам изменить тип данных вашего столбца CreatedBy, и я предполагаю UpdatedBy с nvarchar(MAX) на что-то вроде nvarchar(256); вам не нужно 2 ГБ символов (около 1 миллиарда) для хранения этой информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...