我在奇怪的情况下发生了一个奇怪的错误。
我在光标curLongSkills
中收到的技能名称列表将插入表tbl_new_skill_overview
中,当且仅当它们不存在时才会插入。所以我像往常一样循环游标,并在插入之前检查它是否已经存在。
奇怪的是,我在Syntax error converting the varchar value 'Some Random Skill' to a column of data type int.
行收到了错误SELECT @iCount = COUNT(ID)
。
但是,如果我删除该语句中的WHERE
子句,则会发生 not 。因此,如果我评论或删除WHERE Name = @sSkillName
,则不会发出错误。就好像我认为我将@sSkillName
分配给@iCount
只是因为我在同一查询的@sSkillName
子句中使用WHERE
。
只要我能判断该技能是否已插入tbl_new_skill_overview
,其他方式就足够了。我不一定要这样做。
我也尝试过以下内容,它会出现同样的错误:
SET @iCount = (
SELECT COUNT(ID) AS Line_Count
FROM tbl_new_skill_overview
WHERE Name = @sSkillName
);
服务器正在运行Microsoft SQL Server 2000(我知道,我知道......)。
以下是整个SQL脚本。
DECLARE @sSkillName VARCHAR(200);
DECLARE @iCount INT;
DECLARE curLongSkills CURSOR FOR (
SELECT DISTINCT Name
FROM tbl_new_skill
WHERE Profile = 'long'
AND Parent_ID IS NULL
)
OPEN curLongSkills;
FETCH curLongSkills INTO @sSkillName;
WHILE @@FETCH_STATUS = 0 BEGIN
SELECT @iCount = COUNT(ID)
FROM tbl_new_skill_overview
WHERE Name = @sSkillName; -- No error if this line removed.
IF @iCount = 0 BEGIN
PRINT @sSkillName;
-- TODO: Insert skill
END;
FETCH curLongSkills INTO @sSkillName;
END;
CLOSE curLongSkills;
DEALLOCATE curLongSkills;
答案 0 :(得分:2)
我从来都不喜欢游标 - 但作为一个厚颜无耻的替代品,你应该能够在没有光标的情况下完成你想要的东西。
insert into tbl_new_skill_overview
select //columnNames
from tbl_new_skill
WHERE Profile = 'long'
AND Parent_ID IS NULL
and name not in
(select name from tbl_new_skill)
答案 1 :(得分:2)
问题是愚蠢。
Name
中的tbl_new_skill_overview
列被错误地放入INT
,而不是VARCHAR
。
感谢所有回复的人,特别是 bobs ,要求我展示数据库结构,此时我意识到了这个错误。
答案 2 :(得分:1)
这肯定是一个奇怪的事情。我不知道是什么导致它,但为了解决它,也许你可以做这样的事情:
if not exists (select * from tbl_new_skill_overview where Name = @sSkillName) begin
print @sSkillName;
-- TODO: Insert skill
end
假设您以后不再使用@iCount。