【问题标题】:SQL Server 2000: weird error: cannot convert VARCHAR to INTSQL Server 2000:奇怪的错误:无法将 VARCHAR 转换为 INT
【发布时间】:2011-03-08 16:28:54
【问题描述】:

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

当且仅当它们不存在时,我在光标curLongSkills 中收到的技能名称列表将被插入到表tbl_new_skill_overview 中。所以我像往常一样循环遍历光标,并在插入之前检查它是否已经存在。

奇怪的是,我在SELECT @iCount = COUNT(ID) 行收到错误Syntax error converting the varchar value 'Some Random Skill' to a column of data type int.

但是,如果我删除了该语句中的 WHERE 子句,不会发生这种情况。所以如果我评论或删除WHERE Name = @sSkillName,它不会给出错误。就好像它认为我将@sSkillName 分配给@iCount 只是因为我在同一查询的WHERE 子句中使用了@sSkillName

只要我能判断该技能是否已经插入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;

【问题讨论】:

  • 很奇怪。你试过set @iCount = (select ... 吗?
  • @Blorgbeard:是的,我已经相应地更新了问题,谢谢。
  • 你能发布 tbl_new_skill 和 tbl_new_skill_overview 的结构吗?
  • @bobs:天哪,我有时很愚蠢。 “名称”列错误地是 INT,而不是 VARCHAR。
  • 我想知道这一点。而且,你并不比我们其他人聪明,这很好。否则,我们不需要这个网站。 :)

标签: sql tsql sql-server-2000


【解决方案1】:

我从不喜欢光标——但作为一种厚颜无耻的选择,你应该能够在没有光标的情况下完成你想要的事情。

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)

【讨论】:

  • 谢谢;原来“名称”列被错误地指定为 INT,但很高兴有您的解决方案。 :)
【解决方案2】:

问题是愚蠢。

tbl_new_skill_overview 中的Name 列被错误地输入为INT,而不是VARCHAR

感谢所有回复的人,特别是 bobs 让我展示数据库结构,此时我意识到了错误。

【讨论】:

  • 啊 - 事后看来很明显,嗯 :)
  • 总是小事... ;)
【解决方案3】:

这肯定是一件奇怪的事情。我不知道是什么原因造成的,但要绕过它,也许你可以这样做:

if not exists (select * from tbl_new_skill_overview where Name = @sSkillName) begin
    print @sSkillName;
    -- TODO: Insert skill
end

这是假设您以后不使用 @iCount 做任何其他事情。

【讨论】:

  • 谢谢;原来“名称”列被错误地指定为 INT,但很高兴有您的解决方案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2013-07-21
相关资源
最近更新 更多