SQL Server存储过程+从表的记录中设置错误消息

时间:2010-05-07 06:16:02

标签: sql-server

我的问题是我有一张包含记录集的表格。我正在为其他目的调用存储过程。但是当它发现一些重复的记录时。它需要将错误消息返回给php。

    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是重复的。

我试过这样的事情。这不会有效,它有超过1组重复记录。请帮我加强解决这个目的。

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个以上的问题。

提前致谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您不需要游标将它们全部连接到一个报告字符串中。你可以做到

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

如果您需要附加的计数,则可以在上述运行后使用@@rowcount执行某些操作。