簡體   English   中英

SQl事務 - 查詢不按預期返回值

[英]SQl Transactions - query doesnt return value as expected

tblParent

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

tblChild

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

當刪除來自tblParent的記錄時,應檢查是否有任何子記錄。 如果是,則回滾並返回0.如果否,則將已刪除列更新為“1”並返回1.基本上,執行軟刪除

SP工作正常。 我需要的是根據發生的動作將狀態知道為0或1。 應該怎么做。 我會將此商店程序從c#,linq調用到實體以獲取狀態。 就像是:

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

編輯:

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

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

   EXECUTE sp_executesql @qry
END

在您的腳本中,在您構建的sql語句中無法訪問@status變量,因為“execute sp_executesql @qry”將在不同的空間中執行。 而是使用select n“替換為”set @status = 0“和”set @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 '+@tablename+' where '+@colname+'='+@id+'
               if(@@Error <> 0)
                Begin
                  select 0
                End
               else
                Begin
                 rollback transaction
               update '+@tablename+' set deleted = 1 where '+@colname+' = '+@id+'
                 select 1
                end

execute sp_executesql @qry

嘗試這個:

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 '+@tablename+' where '+@colname+'=@id'
 execute sp_executesql @qry,N'@id nvarchar(50)',@id=@id
 rollback 
 --NO FK violation.So begin another transaction and soft delete
 begin transaction
set @qry='update '+@tablename +' set deleted=1 where '+@colname+'=@id'

execute sp_executesql @qry,N'@id nvarchar(50)',@id=@id
commit

select 1

end try

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

end catch

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM