软删除的存储过程

Rub*_*uby 1 t-sql sql-server stored-procedures soft-delete

此代码用于执行软删除.它首先删除记录.如果删除成功,则回滚然后更新同一记录的标志列.如果该记录具有依赖性并且无法删除,则不执行任何操作.为了知道,行动发生了,我保留了Status变量.但是,无论如何,它总是会产生无效的结果.我哪里错了.

ALTER PROCEDURE SoftDelete
(
  @TableName nvarchar(50), @ColName nvarchar(50),
  @Id nvarchar(50)
)
AS
BEGIN
  DECLARE @qryDel nvarchar(MAX),@qryUpd nvarchar(MAX),@Status int = null,
          @Param  nvarchar(MAX)

  SET @Param = N'@TableName nvarchar(50), @ColName nvarchar(50),
                @Id nvarchar(50)'
  SET @qryDel = N'delete from @tablename where @colname=@id'
  SET @qryUpd = N'update @tablename set deleted = 1 where @colname=@id'

  BEGIN TRY
    BEGIN TRANSACTION
      EXECUTE sp_executesql @qryDel, @Param, @TableName, @ColName, @Id
    ROLLBACK TRANSACTION
    BEGIN TRANSACTION
      EXECUTE sp_executesql @qryUpd, @Param, @TableName, @ColName, @Id
    COMMIT TRANSACTION
    SET @Status = 1
  END TRY

  BEGIN CATCH
    ROLLBACK TRANSACTION
    SET @Status = 0
  END CATCH

  SELECT @Status

END
Run Code Online (Sandbox Code Playgroud)

C#:( Linq To Entities)

public int SoftDelete()
{
  return MYDB.SoftDelete("tblCountry","CountryId,"101").FirstOrDefault ?? -1;
}
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 5

你只是缺少空间......

鉴于这种:

'delete from'+@tablename+'
Run Code Online (Sandbox Code Playgroud)

当你想要删除时tblCountry,你会得到

delete fromtblCountry
Run Code Online (Sandbox Code Playgroud)

您需要在关键字和表变量之间添加空格from!

用这个:

'delete from '+@tablename+'
            ^
            +------- crucial **SPACE** here!!
Run Code Online (Sandbox Code Playgroud)

为什么为什么首先实际删除该行,回滚该交易,然后才进行"软删除"?对我没有任何意义....

  • @Ruby:对于嵌套事务的内部事务,将忽略COMMIT,未命名的ROLLBACK将回滚所有嵌套事务*.如果您在此处命名内部事务,则可能能够在嵌套(不确定)时使其正常工作.请看:http://technet.microsoft.com/en-us/library/ms189336(v = sql.105).aspx (3认同)