2

次の場合に true または false のみを返すストアド プロシージャを作成したいと考えています。

というテーブルがありますGAS_cards

idCard INT PK
idCardType INT

さまざまなidCardを指定します(これまでのところ)

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。少なくとも 1 つの値が 3 の場合、残りも 3 でなければなりません。それ以外の場合は false を返す必要があります。

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なしでこれを行う方法がわかりません。また、プロシージャーの out パラメーターも適切な場合があります。

于 2013-04-12T01:03:23.570 に答える