2009-04-12 7 views
0

J'ai une procédure stockée qui renvoie deux ensembles de résultats basés sur le succès ou l'échec.L'ensemble de résultats est basé sur le succès ou l'échec

résultat succès SP défini: nom, id, erreur, desc
SP échec résultat SRET: erreur, desc

J'utilise la requête suivante pour obtenir le résultat de la procédure stockée. Il renvoie 0 pour le succès et -1 pour l'échec.

declare @ret int 

DECLARE @tmp TABLE (
    name char(70), 
    id int, 
    error char(2), 
    desc varchar(30) 
) 

insert into @tmp 
EXEC @ret = sptest '100','King' 

select @ret 

select * from @tmp 

Si le SP est réussi, le champ quatre est inséré dans la table temporaire car la colonne correspond. Mais en cas d'échec, le jeu de résultats sp a seulement une erreur et desc qui ne correspond pas avec aucune des colonnes dans la table temporaire ... .Je ne peux pas changer le Sp, donc je dois faire quelque chose (pas sûr) dans la table temporaire pour gérer à la fois l'échec et le succès.

Répondre

0

Ma faute !! Était trop rapide dans la réponse. Vous n'avez besoin que de relv sur la valeur de retour, donc la construction de la logique est beaucoup mieux. Si vous voulez toujours utiliser la table temporaire, l'appel du sptest deux fois pourrait être un moyen de le traiter (pas optimal), une fois pour obtenir la valeur de retour et sur la base de cela, avoir 2 tables temporaires différentes vous remplissez (l'un serait avec les 4 champs, l'autre seulement avec 2 champs). Gardez à l'esprit que cette solution n'est pas optimale.

declare @ret int 

DECLARE @tmp TABLE (name CHAR(70), id INT, error char(2), desc varchar(30)) 
DECLARE @tmperror TABLE (error char(2), desc varchar(30)) 


EXEC @ret = sptest '100','King' 

IF @ret != 0 
BEGIN 
    INSERT INTO @tmperror 
    EXEC sptest '100','King'; 
    SELECT * FROM @tmperror; 
END 
ELSE 
BEGIN 
    INSERT INTO @tmp 
    EXEC sptest '100','King'; 
    SELECT * FROM @tmp; 
END 

0

Vous ne pouvez pas renvoyer 2 jeux d'enregistrements différents et charger la même table temporaire. Ni l'un ni l'autre ne peuvent essayer et remplir 2 tables différentes.

Il existe 2 options.

  1. Modifier votre proc stocké

    • Les 4 colonnes sont retournées dans toutes les conditions
    • 1ère paire (nom, ID) Les colonnes sont NULL en cas d'erreur
    • 2ème paire (erreur, desc) sont NULL en cas de succès
  2. Si vous utilisez SQL Server 2005, utilisez le TRY/CATCH pour séparer votre succès. nd chemins de code d'échec. Le code ci-dessous repose sur l'utilisation de la nouvelle gestion des erreurs pour renvoyer le jeu de résultats d'erreur via l'exception/RAISERROR.

Exemple:

CREATE PROC sptest 
AS 
DECLARE @errmsg varchar(2000) 

BEGIN TRY 
    do stuff 
    SELECT col1, col2, col3, col4 FROM table etc 
    --do more stuff 
END TRY 
BEGIN CATCH 
    SELECT @errmsg = ERROR_MESSAGE() 
    RAISERROR ('Oops! %s', 16, 1, @errmsg) 
END CATCH 
GO 

DECLARE @tmp TABLE (name CHAR(70), id INT, error char(2), desc varchar(30) 

BEGIN TRY 
    insert into @tmp 
    EXEC sptest '100','King' 
    select * from @tmp 
END TRY 
BEGIN CATCH 
    PRINT ERROR_MESSAGE() 
END CATCH 
0

Essayez de modifier la définition de votre table afin que les deux premières colonnes sont nullable:

DECLARE @tmp TABLE (
name char(70) null, 
id int null, 
error char(2), 
desc varchar(30) 

)

Hope this helps,

Bill

0

Vous ne pouvez pas faire cela avec un seul appel. Vous devrez l'appeler une seule fois, soit obtenir le statut de retour et ensuite ramifier en fonction de l'état de la commande INSERT..EXEC qui fonctionnera pour le nombre de colonnes qui seront retournées ou appelez-le une fois, en supposant le succès, avec TRY. .CATCH, puis dans le Catch l'appel à nouveau en supposant qu'il échouera (ce qui est comment il est arrivé à la CATCH). Encore mieux, serait soit de réécrire la procédure stockée afin qu'elle renvoie un ensemble de colonnes cohérent ou d'écrire sa propre procédure stockée, fonction ou requête de valeur table, en extrayant le code de cette procédure stockée et en l'adaptant à votre usage. C'est la bonne réponse en SQL.

Questions connexes