2

ストアド プロシージャで複数の更新ステートメントを使用する場合に戻り値を処理する最良の方法は何ですか。

このストアド プロシージャをデータ アダプタで使用しており、更新結果の合計を取得しようとしています。

SQL Server 2008と .NET 4.5を使用しています

例えば:

CREATE PROCEDURE [dbo].[usrsp_MessageConversation_delete]
(
    @fromMbrID int,
    @toMbrID int
)
AS
BEGIN
SET NOCOUNT OFF;
UPDATE mbr_Messages
SET  fromDeleted = 1
WHERE (fromMbrID = @fromMbrID) AND (toMbrID = @toMbrID)

UPDATE mbr_Messages
    SET toDeleted = 1
WHERE (fromMbrID = @toMbrID) AND (toMbrID = @fromMbrID)

//RETURN TOTAL NUMBER OF UPDATED RECORDS
    EG: RETURN  @@ROWCOUNT ??

END

更新されたレコードの総数を返すか、更新されていない場合は 0 を返します。

他のエラー処理を追加する必要がありますか? もしそうなら、何か提案はありますか?

更新:私はこれで行きました:

BEGIN

SET NOCOUNT ON;

DECLARE @rowCounter INT;

BEGIN TRY 

    UPDATE 
        mbr_Messages
    SET 
        fromDeleted = 1
    WHERE 
        (fromMbrID = @fromMbrID) AND (toMbrID = @toMbrID) AND (fromDeleted = 0);

    SET @rowCounter = @@ROWCOUNT;

    UPDATE 
        mbr_Messages
    SET 
        toDeleted = 1
    WHERE 
        (fromMbrID = @toMbrID) AND (toMbrID = @fromMbrID) AND (toDeleted = 0);

    SET @rowCounter = @rowCounter + @@ROWCOUNT;

END TRY
BEGIN CATCH
    PRINT 'Update failed';
END CATCH 

RETURN @rowCounter

END
4

7 に答える 7

1

ストアド プロシージャが短い場合、エラー処理を使用することはあまりお勧めしません。

しかし、これはエラー処理の一例です

IF @@ERROR <> 0 
BEGIN
   --your statement 
   return 12345; -- to mark your error location 
END

@@エラーに関する詳細情報

于 2013-07-08T10:17:10.667 に答える
0
CREATE PROCEDURE [dbo].[usrsp_MessageConversation_delete]
(
    @fromMbrID 整数、
    @toMbrID int
)
なので
宣言する
@SQL1 VARCHAR(800)、
@SQL2 VARCHAR(800)
始める
NOCOUNT をオフに設定します。

SET @SQL1 ='
UPDATE mbr_Messages
SET fromDeleted = ''1''
WHERE (fromMbrID = '+@fromMbrID+') AND (toMbrID = '+@toMbrID+')'
印刷 @SQL1

SET @SQL2 ='
UPDATE mbr_Messages
    SET toDeleted = ''1''
WHERE (fromMbrID = '+@toMbrID+') AND (toMbrID = '+@fromMbrID+')'

印刷 @sql2


EXEC(@SQL1)

EXEC(@SQL2)
終わり


于 2013-07-08T10:27:19.393 に答える
0

これを試して

BEGIN TRY
BEGIN TRAN
 -- Your code here
COMMIT TRAN
END TRY
BEGIN CATCH
    ROLLBACK TRAN
END CATCH

これにより、影響を受けた行 (更新された行) の数が返されます。エラーの場合は 0 (影響を受ける行はロールバック後に 0 になります)。

于 2013-07-08T10:28:23.967 に答える
0

OUTPUT句を使用して、更新/挿入または削除されたレコードをカウントできます

DECLARE @MyTableVar table (
flagdeleted bit NOT NULL);

UPDATE mbr_Messages
SET fromDeleted = 1
OUTPUT INSERTED.fromDeleted INTO @MyTableVar 
WHERE (fromMbrID = @fromMbrID) AND (toMbrID = @toMbrID)

UPDATE mbr_Messages
SET toDeleted = 1
OUTPUT INSERTED.toDeleted INTO @MyTableVar 
WHERE (fromMbrID = @toMbrID) AND (toMbrID = @fromMbrID)

SELECT COUNT(*) FROM @MyTableVar //here is the number of updated records
于 2013-07-08T10:22:54.243 に答える