Типы данных nvarchar и nvarchar несовместимы в операторе вычитания.

Я знаю, что об этом спрашивали раньше. Я исследовал предыдущие ответы и не смог найти решение своей проблемы. Что самое любопытное в моем случае, так это то, что один и тот же код работает в тестовой базе данных, но не в рабочей среде, хотя они абсолютно одинаковы. Сама процедура очень долгая, но мне удалось выделить проблемную часть. Я надеюсь, что кто-то увидит что-то, чего не вижу я, потому что я потерял 2 дня на этом и до сих пор понятия не имею:

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


person Biljana M.    schedule 05.10.2016    source источник
comment
Какая строка выдает ошибку?   -  person diiN__________    schedule 05.10.2016
comment
Здравствуйте, Биляна, вам лучше преобразовать или преобразовать строковые типы данных в int явно для математических операций.   -  person Eralper    schedule 05.10.2016
comment
Имейте в виду, что объединение вашего @strSql, как указано выше, приведет к получению NULL в результате, если одна из ваших переменных возвращает значение null. Либо проверьте их с помощью ISNULL, либо используйте функцию CONCAT (если вы используете SQL Server 2012 или выше — msdn.microsoft.com/en-us/library/hh231515.aspx)   -  person Jens    schedule 05.10.2016
comment
Пример значения для @DisplayFormat   -  person Jaydip Jadhav    schedule 05.10.2016
comment
Кроме того, старайтесь избегать приведения к NVARCHAR без указания длины. sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/   -  person Jens    schedule 05.10.2016
comment
Он жалуется на оператор вычитания, но в коде, который вы показываете, нет -. Это говорит о том, что он скрывается в данных, которые вы просматриваете с помощью этого курсора, поэтому, конечно, мы не можем помочь вам его найти. Это также может объяснить, почему он работает по-разному в разных базах данных (с разными данными).   -  person Damien_The_Unbeliever    schedule 05.10.2016
comment
Кажется, вы не используете кавычки вокруг своих переменных в конечном результате. Я могу себе представить, как это может привести к всевозможным проблемам. Вместо того, чтобы выполнять свой результат, распечатайте его. Это многое прояснит.   -  person Jens    schedule 05.10.2016
comment
Вау, спасибо всем за быстрые ответы! На самом деле все они помогли мне найти проблему, особенно JaydipJ и Daminen_The_unbeliever. Когда я перечислил значения для @DisplayFormat, я нашел одно, содержащее символ, что, конечно, создало проблему. Также я указал длину для nvarchar. большое спасибо!   -  person Biljana M.    schedule 05.10.2016
comment
В будущем, когда вы создадите динамический SQL таким образом, это действительно поможет отладке, если вы распечатаете весь SQL перед его выполнением — вы сразу увидите проблему :)   -  person Luaan    schedule 05.10.2016


Ответы (1)


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

person Alexander Shapkin    schedule 13.10.2017