SQL Server 2000:奇怪的错误:无法将VARCHAR转换为INT

时间:2011-03-08 16:28:55

标签: sql tsql sql-server-2000

我在奇怪的情况下发生了一个奇怪的错误。

我在光标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;

3 个答案:

答案 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。