2015-02-11 37 views
1

我有這個過程從表怎麼去實現某個數值的行數

CREATE PROCEDURE [dbo].[spConfiguration_test] 
@ID int 
AS 

Declare @ERR int 
set @ERR = 0 
DECLARE @Rows int 
SET @Rows =0 
begin tran 

delete from de where ClaimVersion=5 
    set @ERR = @@Error 

    SELECT @Rows= @Rows + @@ROWCOUNT; 

if @ERR = 0 commit tran 
else rollback tran 

刪除行,我希望它返回像1或2或3的值取決於刪除的行數 但它給我(1 row(s) affected)

我必須做什麼改變?

回答

0

delete後立即移動參考@@RowCount。或者,將兩個作業合併爲一個聲明:

delete from de where ClaimVersion = 5 ; 

select @Rows = @Rows + @@ROWCOUNT, @ERR = @@Error; 
+0

謝謝,但它再次表明 (1行(S)的影響) – SpringLearner 2015-02-11 12:16:29

+0

@SpringLearner - 那麼你的DELETE語句只刪除一行。當您運行'Select * from de where ClaimVersion = 5'時,您得到了多少行? – 2015-02-11 12:19:15

+0

是,它只刪除一行,但我希望將其作爲數值。實際上我正在執行這個程序使用Java這樣public public Integer deleteSublist(Integer subPartsId) \t String storedProcedure =「exec spConfiguration_SubParts_Del」+ subPartsId; \t System.out.println(storedProcedure); \t查詢查詢= entityManagerUtil.entityManager.createNativeQuery(storedProcedure); \t return query.executeUpdate(); } – SpringLearner 2015-02-11 12:21:00

0

您也可以SET NOCOUNT OFF

備註

當SET NOCOUNT爲ON時,計數(表示受一個Transact-SQL語句的行數)不會返回。 SET NOCOUNT爲OFF時,返回計數。

CREATE PROCEDURE [dbo].[spConfiguration_test] 
    @ID int 
    AS 

    Declare @ERR int 
    set @ERR = 0 

    SET NOCOUNT OFF 

    begin tran 

    delete from de where ClaimVersion=5 
     set @ERR = @@Error 


    if @ERR = 0 commit tran 
    else rollback tran 

SP創建後執行SP如下:

EXEC [dbo].[spConfiguration_test] 
     @ID = 0 
+0

如何使用這個?你能修改我的代碼嗎? – SpringLearner 2015-02-11 12:19:25

+0

我編輯了我的文章...告訴我它是否有效... – 2015-02-11 12:38:21

+0

它總是說(1行受影響)或(2行受影響)等,我不想這樣。我想一個值像我從選擇計數(*)得到的價值從其中ClaimVersion = 5 – SpringLearner 2015-02-11 12:43:13

0

你所面臨的問題是,受上一語句行@@RowCount返回數字。

在你的情況以前的說法是:set @ERR = @@Error

試試這個

附:不要在你的過程名稱前添加諸如「sp」之類的東西。這與使用「tbl」前綴所有表格一樣糟糕。

+0

我不知道你是否知道java或not.if我使用PRINT @Rows;那麼它只是在sql服務器控制檯中打印。我在返回類型爲integer的java方法中調用此SP。如果刪除了2行,則它應該返回2. – SpringLearner 2015-02-11 13:02:33

+0

什麼是SQL Server控制檯中返回的vvalue?打印線是爲了證明你得到正確的值,而不是Java。先來證明SQL是正確的! – gvee 2015-02-11 13:54:12

+0

P.S. @SpringLearner by「返回類型是整數」是否意味着:存儲過程返回一個整數值或整數數據集(即使該數據集是單個值)。巧妙的是小而重要。 – gvee 2015-02-11 13:56:16

1

注意存儲過程名稱的前綴sp應留給微軟的使用。

如果你想有機會獲得指示行是否已被刪除,那麼你可能想將其添加爲一個輸出參數的標誌。

使用事務來包裝一個DELETE聲明不會做太多。我已經將交易代碼放在假設這是更大程序的一部分的假設之下。

如果您有事務中的多個步驟,您可能需要使用RaIsError來指示呼叫者的一個問題發生的位置,並提供一些特定應用情境,例如參數傳遞給過程。

您也可以在存儲過程中使用try/catch。有時候很方便,有時很笨拙,取決於你需要執行什麼樣的操作以及需要知道多少例外情況。

create procedure [dbo].[Configuration_test] 
    @Id Int, -- Unused. 
    @Deleted Int Output -- Flag: 1 if any rows are deleted, 0 otherwise. 
as 
    set nocount on 

    declare @Err as Int = 0; 
    set @Deleted = 0; 

    begin transaction; 

    delete 
    from de 
    where ClaimVersion = 5; 

    select @Deleted = case when @@RowCount > 0 then 1 else 0 end, 
    @Err = @@Error; 

    if @Err != 0 
    begin 
    rollback transaction; 
    return; 
    end; 

    -- Next operation... 

    set @Err = @@Error; 
    if @Err != 0 
    begin 
    rollback transaction; 
    RaIsError('Boo boo in step 42 processing Id %d.', 13, 42, @Id); 
    end; 

    -- Repeat operation/error check... 

    commit transaction; 
+0

感謝您的答案+ 1,我會盡量按照您的建議,我從7個表中刪除,所以我正在使用事務,但在這裏我有一個單表 – SpringLearner 2015-02-11 17:22:09

+0

@SpringLearner的示例 - 該示例更新了事務內多個操作的改進的錯誤處理。 – HABO 2015-02-11 18:05:44