2008-09-17 6 views
2

Dans une procédure stockée, j'ai besoin d'obtenir le nombre de résultats d'une autre procédure stockée. Plus précisément, j'ai besoin de savoir si elle renvoie des résultats, ou un ensemble vide.Quel est le moyen le plus efficace de compter les résultats d'une procédure stockée, à partir d'une autre procédure stockée?

Je peux créer une variable de table/table temporaire, y exécuter la procédure stockée, puis exécuter un compte select sur ces données. Mais je ne me soucie pas vraiment des données elles-mêmes, tout ce dont j'ai besoin est le nombre (ou la présence/absence de données). Je me demandais s'il existait un moyen plus efficace d'obtenir cette information.

Je ne veux pas simplement copier le contenu de l'autre procédure stockée et le réécrire en tant que compte de sélection. La procédure stockée change trop fréquemment pour que cela soit possible.

Répondre

0

Si vous pouvez réécrire une autre procédure pour être une simple fonction qui retourne un jeu de résultats, vous pouvez simplement choisir le compte (*) de celui-ci.

1

utiliser un paramètre sur

3

Eh bien, selon la façon dont les procédures stockées fonctionnent, @@ ROWCOUNT renvoie le nombre de résultats pour que la SP sera QUELQUE CHOSE faire (y compris les mises à jour): http://msdn.microsoft.com/en-us/library/ms187316.aspx

Cela ne travailler si la dernière chose que vous faites dans le sp est de retourner les lignes au client ... Sinon, vous allez obtenir les résultats d'une autre déclaration. Avoir du sens?

1

Je pense que vous pourriez retourner le nombre de lignes (en utilisant RETURN) ou utiliser un paramètre out pour obtenir la valeur.

+0

En fait, je ne pense pas que ce soit une bonne idée. Parce que la valeur de retour a int type et vous ne pouvez pas passer un bigint avec elle.Donc, dans le cas où vous avez une table avec des millions d'enregistrements avec une clé primaire bigint, votre solution pourrait être en danger et cela ne fonctionne tout simplement pas. En plus, je dois dire que la définition de la valeur de retour en sql est juste de rapporter le résultat d'une opération et rien d'autre (comme les énumérations en C# il devrait toujours avoir des valeurs spécifiques). Il est probablement préférable d'utiliser les paramètres de sortie pour faire une telle chose ou comme notre ami l'a déjà dit, utilisez la variable @@ RowCount. Salutations – Rikki

0

Il semble que quelqu'un d'autre modifie l'autre procédure stockée et vous avez besoin de quelque chose pour vérifier efficacement les résultats, peu importe les changements apportés à cette procédure.

Créez une table de suggestion et insérez le résultat de cette procédure dans celle-ci.

Ensuite, vous pouvez effectuer un nombre de lignes sur les résultats. Ce n'est pas la solution la plus efficace mais la plus fiable si je comprends bien votre problème.

Snipet:

DECLARE @res AS TABLE (
    [EmpID] [int] NOT NULL, 
    [EmpName] [varchar](30) NULL, 
    [MgrID] [int] NULL 
) 

INSERT @res 
EXEC dbo.ProcFoo 

SELECT COUNT(*) FROM @res 
0

Étant donné que vous ne avez pas vraiment besoin de connaître le nombre, mais simplement s'il y a ou pas de données pour votre sproc, je vous recommande quelque chose comme ceci:

CREATE PROCEDURE subProcedure @param1, @param2, @Param3 tinyint OUTPUT 
AS 
BEGIN 
    IF EXISTS(SELECT * FROM table1 WHERE we have something to work with) 
    BEGIN 
    -- The body of your sproc 
    SET @Param3 = 1 
    END 
    ELSE 
    SET @Param3 = 0 
END 

maintenant, vous pouvez exécuter la procédure stockée et vérifier la valeur de @ Param3:

DECLARE @ThereWasData tinyint 
exec subProcedure 'foo', 'bar', @ThereWasData OUTPUT 
IF @ThereWasData = 1 
    PRINT 'subProcedure had data' 
ELSE 
    PRINT 'subProcedure had NO data' 
+0

-1 Parce que le type de données "TinyInt" n'est pas un bon choix pour le nombre d'enregistrements dans une base de données, en particulier lorsque vous travaillez sur des données volumineuses. Il est très clair que vous ne savez pas quelle sera la taille future de la base de données tant que votre logiciel fonctionnera encore et encore jusque-là. Une solution complète devrait toujours fonctionner, pas exceptionnelle. Donc je pense que vous devriez changer le type de données. À votre santé. – Rikki

0

Je pense que vous devriez faire quelque chose l ike ceci:

Create Procedure [dbo].[GetResult] (
    @RowCount BigInt = -1 Output 
) As Begin 

    /* 
     You can do whatever else you should do here. 
    */ 

    Select @RowCount = Count_Big(*) 
     From dbo.SomeLargeOrSmallTable 
     Where SomeColumn = 'Somefilters' 
     ; 

    /* 
     You can do whatever else you should do here. 
    */ 

    --Reporting how your procedure has done the statements. It's just a sample to show you how to work with the procedures. There are many ways for doing these things. 
    Return @@Error; 

End; 

Après avoir écrit que vous pouvez obtenir le résultat de sortie comme ceci:

Declare @RowCount BigInt 
, @Result  Int 
; 

Execute @Result = [dbo].[GetResult] @RowCount Out 

Select @RowCount 
, @Result 
; 

Vive

0
create proc test 
    as 
    begin 
    select top 10 * from customers 
    end 
    go 


    create proc test2 (@n int out) 
    as 
    begin 
    exec test 
    set @n = @@rowcount 
    --print @n 
    end 
    go 

    declare @n1 int =0 

    exec test2 @n1 out 
    print @n1 
    --output result: 10 
Questions connexes