【发布时间】: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