2013-12-21 4 views
0

tblParentSqL Сделки - запрос возврат оленьей кожи значение, как и ожидалось

pid(int) name deleted(bit) 
1  abc 0 
2  def 0 

tblChild

cid(int) name pid(ForeignKey) 
1  aaa 1 
2  bbb 1 

Когда запись из tblParent находится в процессе удаления, необходимо проверить наличие дочерних записей. Если да, откат & return 0. Если нет, то обновить удаленный столбец до «1» и вернуть 1. В принципе, делать мягкое удаление

SP работает нормально. Все, что мне нужно, это знать статус 0 или 1 на основании действия, которое имело место. Как это должно быть сделано. Я бы назвал эту процедуру хранилища от C#, linq к объектам, чтобы получить статус. что-то вроде:

public int somefuntion() //returning a string is also fine.. 
    { 
    return MYDB.SoftDelete(parameters.....); 
    } 

EDIT:

ALTER PROCEDURE SoftDelete 
(
    @TableName nvarchar(50), @ColName nvarchar(50), 
    @Id nvarchar(50) 
) 
AS 
BEGIN 
    DECLARE @qry nvarchar(500) 

    SELECT @qry = 'begin transaction 
       delete '[email protected]+' where '[email protected]+'='[email protected]+' 
       if(@@Error <> 0) 
        Begin 
        --select 0 
        End 
       else 
        Begin 
        rollback transaction 
       update '[email protected]+' set deleted = 1 where '[email protected]+' = '[email protected]+' 
        --select = 1 
        end' 

    EXECUTE sp_executesql @qry 
END 
+0

является @status часть вызывающего кода или части исполняемого динамического sql? Вы используете его в обоих направлениях, он не может работать так – Sklivvz

+0

Его просто переменная для хранения 1 или 0, так что я могу использовать ее позже в C# – Ruby

+0

см. мой второй ответ . – Jade

ответ

1

Попробуйте это:

Declare @status nvarchar(50),@tablename nvarchar(50), @colname nvarchar(50), 
@id nvarchar(50), @qry nvarchar(500) 
set @tablename = 'person' 
set @colname = 'id' 
set @id = '15' 
begin try 
begin transaction 
set @qry='delete '[email protected]+' where '[email protected]+'[email protected]' 
execute sp_executesql @qry,N'@id nvarchar(50)',@[email protected] 
rollback 
--NO FK violation.So begin another transaction and soft delete 
begin transaction 
set @qry='update '[email protected] +' set deleted=1 where '[email protected]+'[email protected]' 

execute sp_executesql @qry,N'@id nvarchar(50)',@[email protected] 
commit 

select 1 

end try 

begin catch 
print(Error_Message()) 
--FK violation.Do nothing.Return 0 
select 0 

end catch 
+0

Проверьте, будет ли tableName и columnName вы – Arindam

+0

Я боюсь, что ваш подход будет работать ... даже если вы проверяете @ @ Ошибка <> 0, он будет генерировать исключение, когда нарушается ограничение ссылочной целостности, которое inturn помещает ваш код C# в exception.So вам нужно добавить try catch в хранимую процедуру. – Arindam

+0

Если я правильно понял, если есть какие-либо нарушения FK, вам нужно мягкое удаление [deleted = 1], и вы хотите вернуть 1. Если нет FK нарушение, лет вам нужно удалить жесткий диск [delete table where ....], и в этом случае вы хотите вернуть 0. Если это ваше требование, см. мой обновленный ответ выше. – Arindam

1

В вашем сценарии переменная @status не доступна в вашем SQL заявления вы строите, потому что "выполнение sp_executesql @qry" будет выполнение в различное пространство. Вместо того, чтобы использовать выберите п»в замене "установить @status = 0" и "установить @status = 1"

Попробуйте

Declare @tablename nvarchar(50), @colname nvarchar(50), 
     @id nvarchar(50), @qry nvarchar(500) 
set @tablename = 'tblParent' 
set @colname = 'pid' 
set @id = '1' 

select @qry = 'begin transaction 
       delete '[email protected]+' where '[email protected]+'='[email protected]+' 
       if(@@Error <> 0) 
       Begin 
        select 0 
       End 
       else 
       Begin 
       rollback transaction 
       update '[email protected]+' set deleted = 1 where '[email protected]+' = '[email protected]+' 
       select 1 
       end 

execute sp_executesql @qry 
+0

:) Просто попробовал это ». Счет транзакции после EXECUTE indica tes - несоответствующее число операторов BEGIN и COMMIT. Предыдущий счетчик = 0, текущий счетчик = 1. «... запрос работает нормально. Когда есть ограничение, оно дает ошибку, а когда нет, оно обновляет столбец. Все, что нужно найти из C#, если оно было 0 или 1. Как насчет использования 'return' – Ruby

+0

iC# использовать командный запрос и возвращать таблицу, Execute() вернет значение, установленное в Return – Jade

+0

. Я обновил свой вопрос. Посмотрите, пожалуйста, посмотрите. – Ruby

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