【问题标题】:stored procedure running continuosly in background存储过程在后台连续运行
【发布时间】:2011-09-17 09:28:53
【问题描述】:

我正在使用一个类文件来更新我的表。我正在插入或更新表,并且在每次更新或插入之后,我正在调用一个存储过程来保存表的最后更新 ID。但是一旦这个存储过程运行,它就永远不会释放资源。它始终在后台执行。为什么会发生这种情况,我该如何阻止它? 这是存储过程:-


Create  procedure [dbo].[Updlastusedkey]
(
@tablename varchar(50)
)
as
Begin
DECLARE @sql varchar(300)
SET @SQL='UPDATE primarykeyTab SET lastKeyUsed = ISNULL(( SELECT Max(ID) from '+@tablename +'),1) WHERE Tablename='''+@tablename +''''
print @SQL
EXEC(@SQL)

END

【问题讨论】:

  • 不释放资源是什么意思?你怎么知道的?你的过程看起来不错。
  • 附带问题:此查询如何找到最后更新的行?
  • 假设我在表 A 中插入一行然后调用存储过程,在运行 SP 之后,当我尝试对表 A 进行任何操作时,它不允许。虽然我可以访问其他表。
  • @knvn:-我正在使用它作为最后插入的 ID..抱歉更新单词
  • 多个表使用基本相同的主键列?这听起来不是一个好主意。但是你为什么不使用 SCOPE_IDENTITY() 函数呢?

标签: sql sql-server-2005 stored-procedures


【解决方案1】:

您是否开启了自动提交?我认为implicit_transactions = OFF 意味着SQL Server 中的Auto Commit = ON。如果不是,您的更新操作可能不会对其打开的事务执行 COMMIT,因此在表上留下写锁。或者,也许只是明确地提交您的更新。

【讨论】:

    【解决方案2】:

    你为什么不直接创建一个视图?

    CREATE VIEW dbo.vPrimaryKeyTab
    AS
        SELECT tablename = 'table1', MAX(id_column) FROM table1
        UNION
        SELECT tablename = 'table2', MAX(id_column) FROM table2
        /* ... */
    ;
    

    现在您不需要更新任何内容或在后台运行任何内容,并且视图始终是最新的(它不会是世界上最快的查询,但至少您只需支付当您需要该信息时需要付费,而不是不断更新它)。

    【讨论】:

    • 是的,你是对的。我也可以通过其他方式做到这一点并且它正在工作。但我想知道为什么这种方法不起作用..
    • 嗯,我不确定有人知道你的陈述“不起作用”和“不允许”是什么意思......
    【解决方案3】:

    试试这个 -

    UPDATE   primarykeyTab   SET  lastKeyUsed = ISNULL(( SELECT Max(ID) from '+@tablename 
    +' WITH (NOLOCK)),1) WHERE Tablename='''+@tablename +'''' WITH (NOLOCK) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多