SQL Server 2000: странная ошибка: невозможно преобразовать VARCHAR в INT - PullRequest
2 голосов
/ 08 марта 2011

У меня странная ошибка, которая происходит в странных обстоятельствах.

Список имен навыков, которые я получаю в курсоре 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 в этом утверждении.Поэтому, если я прокомментирую или удалю 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 ]

2 голосов
/ 08 марта 2011

Проблема была в глупости.

Столбец Name в tbl_new_skill_overview был ошибочно вставлен как INT, а не VARCHAR.

Спасибо всем, кто откликнулсяв частности bobs за просьбу показать структуру базы данных, после чего я осознал ошибку.

2 голосов
/ 08 марта 2011

Мне никогда не нравились курсоры, но в качестве дерзкой альтернативы вы сможете выполнять то, что вы хотите, без курсора.

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 голос
/ 08 марта 2011

Это странное событие наверняка.Я понятия не имею, что является причиной этого, но, чтобы обойти это, возможно, вы могли бы сделать что-то вроде этого:

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

Это предполагает, что вы не используете @iCount для чего-либо еще позже.

...