2015-02-11 5 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

Переместить ссылку на @@RowCount сразу после delete. Или объединить два задания в одном заявлении:

delete from de where ClaimVersion = 5 ; 

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

Спасибо, но это еще раз показывает (1 строка (ы) пострадавших) – SpringLearner

+0

@SpringLearner - Тогда ваше ВЕЬЕТЕ удаляет только один ряд. Сколько строк вы получаете при запуске 'Select * from from где ClaimVersion = 5' –

+0

yes его удаление только одной строки, но я хочу, чтобы это числовое значение.actallY Я выполняю эту процедуру, используя java, как это 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

0

Вы можете также SET NOCOUNT OFF.

Заметки

Если SET NOCOUNT включен, отсчет (с указанием количества строк, затронутых в Transact-SQL заявление) не возвращается. Когда SET NOCOUNT выключен, счетчик возвращается.

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 Как следует:

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

Как это использовать? Можете ли вы изменить мой код? – SpringLearner

+0

Я сделал редактирование своего сообщения ... Скажите, если это сработало ... –

+0

он всегда говорит (затрагивается 1 строка (ы)) или (затронуты 2 строки) и т. Д., Я не хочу этого. значение, как значение, которое я получаю из Select count (*) from where где ClaimVersion = 5 – SpringLearner

0

вопрос вы столкнулись в том, что @@RowCount возвращает количество строк, затронутых в предыдущем заявлении.

В вашем случае предыдущее утверждение: set @ERR = @@Error

Попробуйте вместо

P.S. не приписывайте имена процедур таким вещам, как «sp». Это так же плохо, как префикс всех ваших таблиц с «tbl».

+0

Я не знаю, знаете ли вы java или нет. Если я использую PRINT @Rows; то он просто печатает в консоли sql-сервера. Я вызываю этот SP в java-методе, тип возвращаемого значения которого является integer.If 2 строки удаляются, тогда он должен возвращать 2. – SpringLearner

+0

Что такое vvalue, возвращаемое в консоли SQL Server? Линия печати должна доказать, что вы получаете правильное значение, а не для Java. Давайте сначала докажем, что SQL правильно! – gvee

+0

P.S. @SpringLearner по типу «return type is integer» означает, что хранимая процедура возвращает целочисленное значение или целочисленный набор данных (даже если этот набор данных является единственным значением). Тонко мало, но важно. – gvee

1

Обратите внимание, что префикс sp на имена хранимых процедур должен быть оставлен для использования Microsoft.

Если вы хотите иметь доступ к флагу, который указывает, были ли удалены строки, вы, вероятно, захотите добавить его в качестве выходного параметра.

Использование транзакции для обертывания одного заявления 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

+0

@SpringLearner - пример обновляется с улучшенной обработкой ошибок для нескольких операций внутри транзакции. – HABO

Смежные вопросы