Выберите Query и Update Query в той же StoredProcedure

У меня есть хранимая процедура, в которой я выбираю несколько строк на основе условия, и мне нужно обновить статус этих строк в той же хранимой процедуре. Например,

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. Я получаю доступ к 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)
            {}
        }

Проблема в том, что я получаю необходимые строки на С#, но запрос на обновление в хранимой процедуре не работает. Может ли кто-нибудь дать несколько предложений, где я ошибаюсь.


person user2822362    schedule 04.05.2015    source источник
comment
это From myTable Inner Join myTable.id = #TempTable.id; ваш реальный код   -  person Mohsen    schedule 04.05.2015
comment
Вы игнорируете исключение в catch (Exception ex){}. Если COMMIT TRAN T1 по какой-либо причине не удастся, вы получите строки, но обновления будут отменены. Я подозреваю, что это то, что происходит.   -  person Diego    schedule 04.05.2015
comment
Я обрабатываю исключение в реальном коде, но не получаю никаких исключений. В коде я получаю выбранные строки. Запрос обновления не обновляет значение. Если я отлаживаю хранимую процедуру в запросе обновления SQL, она работает нормально   -  person user2822362    schedule 05.05.2015


Ответы (3)


Следующая строка процедуры

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;
person Nizam    schedule 04.05.2015

Это отлично работает

UPDATE
A
SET
foo = B.bar
FROM
TableA A
JOIN
TableB B ON A.col1 = B.colx
ГДЕ
...

person Raki    schedule 04.05.2015

Вы можете использовать предложение OUTPUT, чтобы сделать это в одном операторе, не создавая временную таблицу.

См. этот пост для примера.

person Jason    schedule 06.05.2015