我知道之前有人问过。我研究过以前的答案,但找不到解决我问题的方法。在我的案例中最令人好奇的是,完全相同的代码在测试数据库上工作,但在生产中却没有,尽管它们完全相同。程序本身很长,但我设法隔离了有问题的部分。我希望有人能看到我不喜欢的东西,因为我在这上面已经失去了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。在程序中也有一个非常相似的查询,实际上相同但在不同的表上,并且一个工作,所以这困扰我这么多。 对不起,如果问题很愚蠢。
答案 0 :(得分:0)
此错误"数据类型nvarchar(max)和nvarchar(max)在减法运算符中不兼容。"将数据类型为nvarchar的两个变量或列减去时抛出。 查找执行子结构运算符的其他查询或可能发生隐含的位置。