此代码用于执行软删除。 它首先删除记录。如果删除成功,则回滚然后更新同一记录的标志列。如果该记录具有依赖性并且无法删除,则不执行任何操作。为了知道,行动发生了,我保留了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
C#:(Linq To Entities)
public int SoftDelete()
{
return MYDB.SoftDelete("tblCountry","CountryId,"101").FirstOrDefault ?? -1;
}
答案 0 :(得分:5)
你只是缺少空间......
鉴于此:
'delete from'+@tablename+'
当您尝试从tblCountry
删除时,您将获得
delete fromtblCountry
您需要在from
关键字和表变量之间添加空格!
使用此:
'delete from '+@tablename+'
^
+------- crucial **SPACE** here!!
但是为什么,为什么你是第一次真正删除该行,回滚该交易,然后才进行“软删除”?对我没有任何意义......