2010-05-07 75 views
2

我的問題是我有一組表記錄了一組表。我爲其他目的調用存儲過程。但是,當它發現一些重複的記錄。它需要返回錯誤消息回到PHP。SQL Server存儲過程+從表記錄中設置錯誤消息

C1    C2    c3 
    abc    32    21.03.2010   
    def    35    04.04.2010   
    pqr    45    30.03.2010    
    abc    12    04.05.2010   
    xyz    56    01.03.2010   
    ghi    21    06.05.2010 
    def    47    17.02.2010  
    klm    93    04.03.2010 
    xyz    11    01.03.2010 

對於上述設置,它需要檢查具有相同c1的記錄。 存儲過程應該返回爲abc,def,xyz是重複的。

我試過這樣的事情。這不起作用,它有一組以上的重複記錄。請幫助我加強這一點來解決目的。

SET @duplicate = (SELECT c1 FROM temp GROUP BY c1 HAVING count(c1) > 1) 
--Check for duplicate concession Nr. 
IF(len(@duplicate) > '1') 
BEGIN 
SET @error = @error + ' Duplicate C1 Number:- ' + @duplicate 
SET @errorcount = @errorcount + 1 
END 

由於這是一種類型錯誤,我正在檢查errorcount。

IF @errorcount <> '0' 
BEGIN 
GOTO E_General_Error 
END 

-- If an error occurs, rollback and exit 
E_General_Error: 
    PRINT 'Error' 
SET @error = @error 
IF @@error <> 0 SET @error = 'Database update failed' 
    ROLLBACK TRANSACTION update_database 
    RETURN 
END 

現在它能夠返回重複的c1號碼abc。如果有超過1個問題出現。

在此先感謝!

回答

1

你不需要遊標將它們連接成一個報告字符串。如果您需要追加你也許可以做一些與@@rowcount以上運行後的數,您可以做

DECLARE @duplicate VARCHAR(MAX) 

SET @duplicate = '' 

SELECT @duplicate = @duplicate + ' 
Duplicate C1 Number:- ' + CONVERT(varchar(100),c1) 
FROM temp 
GROUP BY c1 
HAVING count(c1) > 1 

+0

它,像一個魅力工作。謝謝你的快速回復。我一些如何嘗試這種方式沒有設置@duplicate =''。它沒有爲我工作。如果你能解釋我爲什麼需要初始化,那將是非常好的。 – satya 2010-05-07 12:35:19

+0

@Lucky。你需要初始化它的唯一原因是因爲如果你將NULL和一個字符串連接在一起,你最終會得到NULL。可以避免使用COALESCE進行初始化,當你不想像這裏添加額外的分隔符時這很有用http://vyaskn.tripod.com/code/cat.txt – 2010-05-07 13:02:18

+0

啊 - 我忘了你可以使用這個方便的技巧。工作很好。 – SqlRyan 2010-05-07 14:44:51

1

通過將查詢結果設置爲該變量,您只返回第一行。在這種情況下,我認爲你需要使用CURSOR來完成它,因爲你正在處理每一行。這是否符合你想要做的事情?

DECLARE @Duplicate VARCHAR(3) 
DECLARE @Results VARCHAR(MAX) 

DECLARE cursor_name CURSOR 
FOR SELECT c1 FROM temp GROUP BY c1 HAVING count(c1) > 1 

OPEN cursor_name 
FETCH NEXT FROM cursor_name into @Duplicate 

WHILE @@FETCH_STATUS <> 0 
BEGIN 

    SET @Results = Results & @Duplicate & ', ' 

    OPEN cursor_name 
    FETCH NEXT FROM cursor_name into @Duplicate 

END 

CLOSE cursor_name 
DEALLOCATE cursor_name 

IF LEN(@Results) > 2 
BEGIN 
    SET @Results = LEFT(@Results, LEN(@Results)-2) 
    SET @error = @error + ' Duplicate C1 Number:- ' + @duplicate 
    SET @errorcount = @errorcount + 1 
END 
+0

Thanku你的快速回復:-) – satya 2010-05-07 12:37:29

相關問題