【发布时间】:2011-11-02 23:49:37
【问题描述】:
我正在尝试使用通用参数运行此过程。
如果我因为某些外键而无法删除,它应该更新该行。
但是当我执行它时,仍然永远运行并且没有完成该过程,有什么想法吗?
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[stp_Batch_Registros_Desativados_Excluir]
@table_name VARCHAR(100),
@id int
AS
BEGIN
DECLARE @column VARCHAR(100),
@sql VARCHAR(300);
SET @column = (SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMNPROPERTY(OBJECT_ID(TABLE_NAME),COLUMN_NAME,'IsIdentity') = 1
AND TABLE_NAME = @table_name);
BEGIN TRY
select @sql = 'DELETE ' + @table_name + ' WHERE ' + @column + ' = ' + CONVERT(VARCHAR,@id);
exec(@sql);
END TRY
BEGIN CATCH
select @sql = 'UPDATE ' + @table_name + ' SET fg_excluido = 2 WHERE ' + @column + ' = ' + CONVERT(VARCHAR,@id) ;
exec(@sql);
END CATCH;
END
【问题讨论】:
-
您不能在 T-SQL 语句中为表名或列名使用参数 - 除非先将语句创建为字符串,然后“执行”该字符串(动态SQL - 在尝试使用动态 SQL 之前,您必须阅读The Curse and Blessing of Dynamic SQL!)
-
我觉得有必要指出潜在的 SQL 注入...
-
你们在这里过激。表名是一个参数,他正在构建一个执行的 sql 语句。我认为这不是问题。
-
@marcio,你有没有运行 sql profiler 来查看它的锁定位置?是在删除还是更新?桌上是否有可能影响事物的触发器?
标签: sql-server-2008 sql-delete