2

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

我有一张桌子叫GAS_cards

idCard INT PK
idCardType INT

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

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;否则它应该返回一个错误。

4

2 回答 2

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
于 2015-03-13T08:49:16.330 回答
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,我看不到如何做到这一点。该过程的输出参数也可能很好。

于 2013-04-12T01:03:23.570 回答