我的问题是我有一张包含记录集的表格。我正在为其他目的调用存储过程。但是当它发现一些重复的记录时。它需要将错误消息返回给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个以上的问题。
提前致谢!
答案 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
执行某些操作。