如何将此存储过程转换为简单查询

时间:2011-08-15 12:52:54

标签: c# asp.net sql sql-server

我编写了这个存储过程,但我将所有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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果你想在代码中执行它,我会将它分成几个方法并让save方法返回标识。然后,您可以创建一个包含所有三个查询的方法,并通过代码模拟存储过程中的相同逻辑

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    
}