2016-10-05 4 views
0

Я знаю, что это было задано раньше. Я исследовал предыдущие ответы и не смог найти решение для своей проблемы. Самое любопытное в моем случае - тот же самый код работает в тестовой базе данных, но не на производстве, хотя они точно такие же. Сама процедура очень длинная, но мне удалось выделить проблемную часть. Я надеюсь, что кто-то видит что-то я делаю не потому, что я потерял 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. Существует также один очень похожий запрос в процедуре, фактически такой же, но на другой таблице, и этот работает, так что это меня так сильно беспокоит. Извините, если вопрос глуп.

+0

Какая строка производит ошибку? –

+0

Здравствуйте, Бильяна, вы должны лучше конвертировать или лить строковые типы данных в int явно для математических операций. – Eralper

+0

Имейте в виду, что при конкатенации вашего @strSql, как указано выше, в результате получается NULL, если одна из ваших переменных возвращает значение null. Либо проверьте их с помощью ISNULL, либо используйте функцию CONCAT (если вы используете SQL Server 2012 или выше - https://msdn.microsoft.com/en-us/library/hh231515.aspx) – Jens

ответ

0

Эта ошибка «Типы данных nvarchar (max) и nvarchar (max) несовместимы в операторе вычитания». когда вы вычитаете две переменные или столбцы с типом данных как nvarchar. Ищите ваши другие запросы, в которых вы выполняете оператор substruct или где это может произойти.

Смежные вопросы