2011-08-15 61 views
0

我編寫此存儲過程,但我將所有sql查詢返回到站點代碼,並且我有一點問題來轉換此查詢。我在一個表中插入數據,然後將其插入到第一個表中生成的密鑰的另一個表中。我不知道從站點代碼編寫這個代碼的最好方法是什麼。要製作三種方法還是什麼?如何將此存儲過程轉換爲簡單查詢

@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 

回答

3

有很多方法可以使用OUTPUT子句。下面的模式可能會爲你工作:

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

如果你想這樣做的代碼,我將其分割成幾個方法,並有保存方法返回的身份。然後,您可以創建一個包含所有三個查詢的方法,並通過代碼模擬存儲過程中的相同邏輯。

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  
}