2011-12-12 120 views
0

我有以下表格:存儲過程拒絕插入數據

ThisCategoryID int IDENTITY, AUTO_INCREMENT 
Title   text 
Type   text 
CategoryID  int ALLOW NULLS 
IsActive  bit 
OrderIndex  int ALLOW NULLS 

與此數據:

ThisCategoryID Title Type   CategoryID IsActive OrderIndex 
0    Lunch Menu Section NULL  True  3 
2    Dessert Menu Section NULL  True  1 
3    Banh Mi Food Item  0   True  4 

及以下存儲過程:

ALTER PROCEDURE [dbo].[sp_new_category] 
    @Title text, 
    @Type text, 
    @CategoryID int = null, 
    @IsActive bit, 
    @OrderIndex int = null 
AS 
    DECLARE @Identity int 
    IF (SELECT count(*) FROM Category WHERE difference(title, @title) = 4) > 0 
    BEGIN 
     INSERT INTO Category (Title, Type, CategoryID, IsActive, OrderIndex) VALUES (@Title, @Type, @CategoryID, @IsActive, @OrderIndex) 
     SET @Identity = scope_identity() 
    END 
    ELSE 
    BEGIN 
     SET @Identity = -1 
    END 
    SELECT @Identity AS ID 
    RETURN @Identity 

沒有項目在標題爲「小吃」的表格中,sp_new_category每次使用以下參數運行時都會得到-1:

@Title: Snack 
@Type: Menu Section 
@CategoryID: NULL 
@IsActive: True 
@OrderIndex: NULL 

有人可以向我解釋爲什麼是這樣嗎?

+2

您不應該使用'text'數據類型,因爲它已被棄用,並且無論如何,它似乎完全不適用於像'Snack'和'Menu Section'這樣的短字符串。如果你使用'varchar',那麼你可以使用正常的平等比較而不是你的'差異'測試。 (這似乎也是錯誤的,因爲這是基於'soundex'值) –

+1

我同意Martin的觀點,這可能是由於IF()語句沒有返回預期結果。更改您的IF邏輯並解決問題。 – Zachary

回答

2

我相信你對以下條件目的是檢查是否有人試圖通過標題進入一個已經存在的項目(有SOUNDEX匹配):

IF (SELECT count(*) FROM Category WHERE difference(title, @title) = 4) > 0 

然而,條件寫入的方式,你會只有添加項目,如果他們是相似的。試試這個:

DECLARE @Identity int 
IF (SELECT count(*) FROM Category WHERE difference(title, @title) = 4) > 0 
BEGIN 
    SET @Identity = -1 
END 
ELSE 
BEGIN 
    INSERT INTO Category (Title, Type, CategoryID, IsActive, OrderIndex) VALUES (@Title, @Type, @CategoryID, @IsActive, @OrderIndex) 
    SET @Identity = scope_identity() 
END 
SELECT @Identity AS ID 
RETURN @Identity 
+0

http://msdn.microsoft.com/en-us/library/ms188753(v=SQL.90).aspx:「4表示很強的相似性或相同的值」 你有我的意圖寫,但根據我寫道:if(count(similar)> 0){insert ...} – lowerkey

+0

修復了我的答案。 –

0

我錯過了什麼嗎?

IF陳述是錯誤的,所以他去ELSE並把SET @Identity = -1。所以它會return -1

2
SELECT difference('Snack', 'Lunch') 
UNION SELECT difference('Snack', 'Dessert') 
UNION SELECT difference('Snack', 'Banh Mi') 

3 
1 
2 

你永遠差異等於4,毫無所以你插入永遠不會運行,所以@identity永遠是-1

difference是SOUNDEX編碼文本的區別,這是英文名稱的一個古老的散列。它不適用於外來詞。如果您告訴我們您認爲您正在使用它來完成,我們可能會幫助您。