在评估重复行时,在SQL上返回True False

时间:2013-04-12 00:35:36

标签: sql stored-procedures

我想创建一个存储过程,只有在发生以下情况时才返回true或false:

我有一张名为GAS_cards

的表格
idCard INT PK
idCardType INT

我指定了各种idCards(到目前为止我有这个)

CREATE PROCEDURE [dbo].[GAS_cards_spEvaluateCards_many] 
    @cardString VARCHAR(100)
AS 

SELECT * 
FROM GAS_cards 
WHERE (@cardString = '-1' OR ',' + @cardString + ',' LIKE '%,' + CONVERT(VARCHAR, idCard) + ',%') 

我想在这里做的是以下评估。 假设查询返回10行。一切都取决于idCardType。如果至少有一个值等于3,则其余值必须为3;否则它应该返回错误。

2 个答案:

答案 0 :(得分:3)

在接受的答案中一切正常,但出于性能原因,如果这个单一结果,最好使用RETURN语句。 示例我们有sp_checkexist

IF EXISTS(...) 
RETURN 0 
ELSE 
RETURN 1

在其他地方我们以这种方式检查TRUE或FALSE条件:

IF ( sp_checkexist(@variable)=1 ) 
... statement if TRUE
else
... statement if FALSE

答案 1 :(得分:2)

放手一搏。我没有可用于测试的SQL实例,但在大多数情况下,我认为它可以解决问题。基本上我采用idCard字符串值,然后将其添加到动态sql中以创建一个id表。然后我将表中的行数与值为3的行数进行比较。如果它们相等则我选择1,否则执行0.

CREATE PROCEDURE [dbo].[GAS_cards_spEvaluateCards_many] 
    @cardString VARCHAR(100)
AS 

--Temporary table for our cards
CREATE TABLE #Cards
(
 idCard int,
 idCardType int 
)

DECLARE @Sql nvarchar(max);

SET @Sql = 'INSERT INTO #Cards 
SELECT idCard, idCardType FROM GAS_cards
WHERE idCard in (' + @cardString + ')';

IF EXISTS(
SELECT * FROM #Cards c1
LEFT OUTER JOIN #Cards c2
   ON c1.idCard = c2.idCard
   AND c2.idCardType = 3 -- Your card type
WHERE
   c2.idCard IS NULL)
  SELECT 0
ELSE
  SELECT 1

我认为您可以使用

SET @TotalRows = @@rowcount

但是我不太确定动态sql的范围是否会让你看到计数。此外,如果你带来一个像你说的字符串,我没有看到没有动态sql如何做到这一点。此外,程序的out参数也可能是好的。