У меня странная ошибка, которая происходит в странных обстоятельствах.
Список имен навыков, которые я получаю в курсоре 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;