Я знаю, что это было задано раньше. Я исследовал предыдущие ответы и не смог найти решение для своей проблемы. Самое любопытное в моем случае - тот же самый код работает в тестовой базе данных, но не на производстве, хотя они точно такие же. Сама процедура очень длинная, но мне удалось выделить проблемную часть. Я надеюсь, что кто-то видит что-то я делаю не потому, что я потерял 2 дня на этом и до сих пор не имеют ни малейшего представления:Типы данных nvarchar и nvarchar несовместимы в операторе вычитания
DECLARE luUpdateCursor CURSOR FORWARD_ONLY STATIC READ_ONLY FOR
SELECT Id, DisplayFormat, LookupName FROM #ProductResults WHERE Value IS NOT NULL AND LEN(LTRIM(RTRIM(LookupName))) > 0
OPEN luUpdateCursor
FETCH NEXT FROM luUpdateCursor
INTO @Id, @DisplayFormat, @LookUpName
WHILE @@FETCH_STATUS = 0
BEGIN
IF @LocaleID = @SystemLocaleId
BEGIN
SET @strSql = '
UPDATE PR
SET PR.Value = ' + REPLACE(REPLACE(@DisplayFormat,'[','lk.['),',' , '+ '','' + ') + '
FROM
#ProductResults PR
INNER JOIN
tblk_' + RTRIM(@LookUpName) + ' lk WITH(NOLOCK) ON PR.Value = lk.Id
WHERE
PR.Id = ' + CONVERT(NVARCHAR,@Id)
END
ELSE
BEGIN
SET @strSql = '
UPDATE PR
SET PR.Value = COALESCE(' + REPLACE(REPLACE(@DisplayFormat,'[','lkl.['),',' , '+ '','' + ') + ',' + REPLACE(REPLACE(@DisplayFormat,'[','lk.['),',' , '+
'','' + ') + ')
FROM
#ProductResults PR
INNER JOIN
tblk_' + RTRIM(@LookUpName) + ' lk WITH(NOLOCK) ON PR.Value = lk.Id
LEFT OUTER JOIN
tblk_' + RTRIM(@LookUpName) + '_Locale lkl WITH(NOLOCK) ON PR.Value = lkl.fk_Id AND lkl.FK_Locale = ' + CAST(@LocaleID AS NVARCHAR(20)) + '
WHERE
PR.Id = ' + CONVERT(NVARCHAR,@Id)
END
EXECUTE sp_executesql @strSql;
FETCH NEXT FROM luUpdateCursor
INTO @Id, @DisplayFormat, @LookUpName
END
CLOSE luUpdateCursor
DEALLOCATE luUpdateCursor;
Таблица #ProductREsults имеет Id INT и DisplayFormat и LookupNAme являются как NVARCHAR. Существует также один очень похожий запрос в процедуре, фактически такой же, но на другой таблице, и этот работает, так что это меня так сильно беспокоит. Извините, если вопрос глуп.
Какая строка производит ошибку? –
Здравствуйте, Бильяна, вы должны лучше конвертировать или лить строковые типы данных в int явно для математических операций. – Eralper
Имейте в виду, что при конкатенации вашего @strSql, как указано выше, в результате получается NULL, если одна из ваших переменных возвращает значение null. Либо проверьте их с помощью ISNULL, либо используйте функцию CONCAT (если вы используете SQL Server 2012 или выше - https://msdn.microsoft.com/en-us/library/hh231515.aspx) – Jens