在相同的StoredProcedure中选择Query and Update Query

时间:2015-05-04 18:29:18

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

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

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#中获取了所需的行,但存储过程中的更新查询无法正常工作。 任何人都可以在我出错的地方提出一些建议。

4 个答案:

答案 0 :(得分: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

最后,如果没有SELECT TOP

,则不应使用ORDER BY
SELECT TOP 5 * INTO #TempTable FROM myTable WHERE ENABLED = 1;

答案 1 :(得分:1)

这很好用

UPDATE
    一个
SET
    foo = B.bar

    表A A
    JOIN
    表B B ON A.col1 = B.colx
WHERE
    ...

答案 2 :(得分:1)

UPDATE myTable 
SET [Status] = 'Locked'  
From myTable  
WHERE id in (select TOP 5 * FROM myTable WHERE enabled=1)

答案 3 :(得分:0)

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

有关示例,请参阅this post