2011-03-08 102 views
2

我有奇怪的情況下發生的奇怪的錯誤。SQL Server 2000:奇怪的錯誤:無法將VARCHAR轉換爲INT

我在光標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; 
+1

奇怪。你有沒有試過'set @iCount =(select ...'? – Blorgbeard 2011-03-08 16:32:21

+0

@Blorgbeard:是的,我已經更新了相應的問題,謝謝 – Teekin 2011-03-08 16:38:45

+0

你可以發佈tbl_new_skill和tbl_new_skill_overview的結構嗎? – bobs 2011-03-08 16:38:55

回答

2

問題是愚蠢的。

Name列中的tbl_new_skill_overview被錯誤地輸入爲INT而不是VARCHAR

感謝所有回覆的人,特別是bobs因爲要求我展示數據庫結構,此時我意識到了錯誤。

+0

啊 - 在後見之明似乎很明顯,嗯:) – Blorgbeard 2011-03-08 16:53:46

+1

總是小事情......;) – Teekin 2011-03-08 16:54:03

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) 
+0

謝謝;原來'名稱'列被錯誤地指定爲INT,但很高興有您的解決方案。 :) – Teekin 2011-03-08 16:53:24

1

這確實是個奇怪的現象。我不知道是什麼原因引起的,但要避開它,也許你可以做這樣的事情:

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

這是假設你不使用@iCount爲別的以後。

+0

謝謝;原來'名稱'列被錯誤地指定爲INT,但很高興有您的解決方案。:) – Teekin 2011-03-08 16:54:28

相關問題