【问题标题】:The data types nvarchar and nvarchar are incompatible in the subtract operator数据类型 nvarchar 和 varchar 在减法运算符中不兼容
【发布时间】:2016-10-05 07:28:20
【问题描述】:

我知道以前有人问过这个问题。我对以前的答案进行了研究,但找不到解决问题的方法。就我而言,最令人好奇的是,完全相同的代码在测试数据库上运行,但在生产环境中运行,尽管它们完全相同。程序本身很长,但我设法隔离了有问题的部分。我希望有人能看到我没有看到的东西,因为我在这件事上浪费了 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 的 Id 为 INT,DisplayFormat 和 LookupNAme 都是 NVarchar。过程中还有一个非常相似的查询,实际上相同但在不同的表上,并且一个有效,所以这让我非常困扰。 对不起,如果问题很愚蠢。

【问题讨论】:

  • 哪一行产生错误?
  • 您好 Biljana,您最好将字符串数据类型转换或强制转换为 int 以进行数学运算
  • 另外,尽量避免在没有指定长度的情况下转换为 NVARCHAR。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/…
  • 它抱怨减法运算符,但您显示的代码中没有 - 。这表明它潜伏在您通过该光标拉出的 data 中,因此我们当然无法帮助您找到它。这也可以解释为什么它在不同的数据库(使用不同的数据)上的工作方式不同
  • 您似乎没有在最终结果中的变量周围使用引号。我可以想象这会如何产生各种各样的问题。与其执行结果,不如将其打印出来。它会让很多事情变得清晰。

标签: sql-server tsql runtime-error data-conversion nvarchar


【解决方案1】:

此错误“数据类型 nvarchar(max) 和 nvarchar(max) 在减法运算符中不兼容。”当您减去数据类型为 nvarchar 的两个变量或列时抛出。 查找执行 substruct 运算符或可能隐式发生的其他查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2017-04-07
    相关资源
    最近更新 更多