2011-08-15 4 views
0

J'écris cette procédure stockée mais je renvoie toutes les requêtes sql au code du site et j'ai un petit problème pour convertir cette requête. J'insère des données dans une table puis l'insère dans une autre table avec la clé qui est générée dans la première table. Je ne sais pas quelle est la meilleure façon d'écrire cela à partir du code du site. Faire trois méthodes ou quoi?Comment faire pour convertir cette procédure stockée en requête simple

@m_UserId uniqueidentifier, 
@m_WispTypeId int, 
@m_CreatedOnDate datetime, 
@m_PrivacyTypeId int, 
@m_WispText nvarchar(200) 
AS 

SET XACT_ABORT, NOCOUNT ON 

DECLARE @starttrancount int 

BEGIN TRY 
    SELECT @starttrancount = @@TRANCOUNT 

    IF @starttrancount = 0 
     BEGIN TRANSACTION 

     DECLARE @wispId int 

     INSERT INTO dbo.tbl_Wisps 
     (UserId,WispTypeId,CreatedOnDate,PrivacyTypeId,WispText) 
     VALUES 
     (@m_UserId,@m_WispTypeId,@m_CreatedOnDate,@m_PrivacyTypeId,@m_WispText) 

     SELECT @wispId = SCOPE_IDENTITY() 

     INSERT INTO dbo.tbl_CommentableEntity 
     (ItemId) 
     VALUES 
     (@wispId) 

     DECLARE @ceid int 

     select @ceid = SCOPE_IDENTITY() 

     UPDATE dbo.tbl_Wisps SET CommentableEntityId = @ceid WHERE WispId = @wispId 

    IF @starttrancount = 0 
     COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
     ROLLBACK TRANSACTION 
    RAISERROR ('Error in adding new wisp', 16, 1) 
END CATCH 

Répondre

3

Il existe un certain nombre de façons d'utiliser la clause OUTPUT. Le schéma suivant peut travailler pour vous:

insert dbo.tbl_CommentableEntity (ItemId) 
select wispId from (
    insert dbo.tbl_Wisps (UserId,WispTypeId,CreatedOnDate,PrivacyTypeId,WispText) 
    output inserted.wispId 
    values (@m_UserId, @m_WispTypeId, @m_CreatedOnDate, @m_PrivacyTypeId, @m_WispText) 
) as ins 
0

Si vous voulez le faire dans le code, je le diviser en plusieurs méthodes et définir les méthodes sauver retournent l'identité. Ensuite, vous pouvez simplement créer une méthode qui englobe les trois requêtes, et qui émule par le code la même logique que dans la procédure stockée

public int SaveThis() 
{ 
    return -1 //return identity 
} 

public int SaveThat(int thisID) 
{ 
    return -2 //return identity 
} 

public void SaveThisAndThat() 
{ 
    int thisID = this.SaveThis(); 
    int thatID = this.SaveThat(thisID); 

    //so on and so forth  
} 
public int SaveThis() 
{ 
    return -1 //return identity 
} 

public int SaveThat(int thisID) 
{ 
    return -2 //return identity 
} 

public void SaveThisAndThat() 
{ 
    int thisID = this.SaveThis(); 
    int thatID = this.SaveThat(thisID); 

    //so on and so forth  
} 
Questions connexes