我想创建一个存储过程,只有在发生以下情况时才返回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;否则它应该返回错误。
答案 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参数也可能是好的。