【问题标题】:Select Query and Update Query in same StoredProcedure在同一个 StoredProcedure 中选择查询和更新查询
【发布时间】:2015-05-04 18:29:17
【问题描述】:

我有一个存储过程,我将在其中根据条件选择一些行,并且我需要在同一个存储过程中更新这些行的状态。 例如

Create Procedure [dbo].[myProcedure]
As
BEGIN
BEGIN TRAN T1
SET NOCOUNT ON
SELECT TOP 5 * INTO #TempTable FROM myTable WHERE ENABLED = 1;
UPDATE myTable SET [Status] = 'Locked' From myTable Inner Join on #TempTable myTable.id = #TempTable.id;
SELECT * FROM #TempTable;
DROP Table #TempTable;
COMMIT TRAN T1
END

当我在 SQL 中调试时,存储过程工作正常。我正在像这样通过 C# 访问 StoredProcedure。

private ProcessData[] ReadFromDb(string StoredProcedure, SqlConnection Connection)
        {
            List<ProcessData> Data = new List<ProcessData>();
            SqlCommand Command = new SqlCommand(StoredProcedure, Connection);
            Command.CommandType = System.Data.CommandType.StoredProcedure;
            try
            {
                Command.CommandTimeout = CONNECTION_TIMEOUT;
                using (SqlDataReader Reader = Command.ExecuteReader())
                {
                    while (Reader.Read())
                    {
                        Data.Add(new ProcessData()
                        {
                              Id = Reader["Id"];
                              ...
                           });
                    }
                }
            }
            catch (Exception ex)
            {}
        }

问题是我在 C# 中获取了所需的行,但存储过程中的更新查询不起作用。 谁能给我一些建议我哪里出错了。

【问题讨论】:

  • "From myTable Inner Join myTable.id = #TempTable.id;"你的真实代码
  • 您忽略了catch (Exception ex){} 中的异常。如果COMMIT TRAN T1 因任何原因失败,您将获得这些行,但更新将被回滚。我怀疑这是正在发生的事情。
  • 我正在处理实际代码中的异常,但我没有收到任何异常。在代码中,我得到了选定的行。更新查询不更新值。如果我在 SQL 更新查询中调试存储过程工作正常

标签: c# .net sql-server stored-procedures system.data


【解决方案1】:

下面的过程

UPDATE myTable 
SET [Status] = 'Locked' 
From myTable 
Inner Join myTable.id = #TempTable.id;

应该是

UPDATE myTable 
SET [Status] = 'Locked' 
From myTable 
Inner Join #TempTable 
   on myTable.id = #TempTable.id;

并且COMMINT TRAN T1 应该替换为COMMIT TRAN T1

最后,你不应该在没有ORDER BY的情况下使用SELECT TOP

SELECT TOP 5 * INTO #TempTable FROM myTable WHERE ENABLED = 1;

【讨论】:

    【解决方案2】:

    这很好用

    更新
    一个
    套装
    foo = B.bar
    来自
    表A A
    加入
    表 B B ON A.col1 = B.colx
    在哪里
    ...

    【讨论】:

      【解决方案3】:
      UPDATE myTable 
      SET [Status] = 'Locked'  
      From myTable  
      WHERE id in (select TOP 5 * FROM myTable WHERE enabled=1)
      

      【讨论】:

        【解决方案4】:

        您可以使用 OUTPUT 子句在一个语句中执行此操作,而无需创建临时表。

        有关示例,请参阅this post

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-16
          • 2018-06-20
          • 2013-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多