2010-10-17 7 views
2

Désolé, beaucoup de code s'affiche.Obtention de valeur à partir d'une procédure stockée dans une autre procédure stockée

J'ai vu une autre question comme celle-ci qui utilisait des paramètres de sortie. J'utilise l'instruction RETURN pour retourner la valeur que je veux utiliser.

J'ai une InsertMessage de procédure stockée qui ressemble à ceci:

 
ALTER PROCEDURE dbo.InsertNewMessage 

    (
    @messageText text, 
    @dateTime DATETIME, 
    @byEmail bit, 
    @bySMS bit 
    ) 

AS 
    DECLARE @NewId int 
    BEGIN 
    BEGIN TRANSACTION 

    INSERT INTO MessageSet VALUES (@byEmail, @bySMS, @dateTime, @messageText) 
    SET @NewId = SCOPE_IDENTITY() 
    COMMIT 
    END 

    RETURN @NewId 

qui une autre procédure stockée utilise:

 
ALTER PROCEDURE dbo.InsertMessageFromUserToGroup 

    (
    @userEmail nvarchar(256), 
    @groupId int, 
    @messageText text, 

    @bySMS bit, 
    @byEmail bit 
    ) 

AS 
    --Inserts a new message to a group 
    DECLARE @messageId int 
    DECLARE @dateTime DATETIME = GETDATE() 
    --First check if user is a part of the group 
    IF NOT EXISTS (SELECT userEmail FROM UserToGroupSet WHERE userEmail = @userEmail AND groupId = @groupId) 
     RETURN 'User not part of group' 
    ELSE --User is a part of the group, add message 
    BEGIN 
     BEGIN TRANSACTION 
      SET @messageId = [dbo].[InsertNewMessage](@messageText, @dateTime, @bySMS, @byEmail) 
      INSERT INTO MessageToUser VALUES(@userEmail, @messageId) 
      INSERT INTO MessageToGroup VALUES(@messageId, @groupId) 
     COMMIT 
    END 

La ligne qui provoque la peine et dont je ne suis pas sûr comment handle est celui-ci:

 
SET @messageId = [dbo].[InsertNewMessage](@messageText, @dateTime, @bySMS, @byEmail) 

La syntaxe semble correcte car je peux l'enregistrer. Quand je l'exécute, j'obtiens le message d'erreur:

 
Running [dbo].[InsertMessageFromUserToGroup] (@userEmail = [email protected], @groupId = 5, @messageText = sdfsdf, @bySMS = false, @byEmail = true). 

Cannot find either column "dbo" or the user-defined function or aggregate "dbo.InsertNewMessage", or the name is ambiguous. 
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1. 
No rows affected. 
(0 row(s) returned) 
@RETURN_VALUE = 
Finished running [dbo].[InsertMessageFromUserToGroup]. 

Il semble que l'autre procédure stockée est introuvable. J'ai essayé différentes manières d'appeler la procédure mais tout le reste échoue également. Aucune suggestion?

Répondre

5

Essayez de changer

SET @messageId = [dbo].[InsertNewMessage](@messageText, @dateTime, @bySMS, 
    @byEmail) 

à

EXEC @messageId = [dbo].[InsertNewMessage] @messageText, @dateTime, @bySMS, 
    @byEmail 

Notez que SET a été modifié pour EXEC, et les parenthèses ont été supprimés des paramètres.

Voir l'exemple dans le MSDN documenation à la fin de l'article pour plus d'informations.

+0

Merci, cela fonctionne maintenant. Lien utile! – Phil