Выберите Запрос и Обновить запрос в том же 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. Я получаю доступ к Stored Procedure через C#, как это.
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 ответа
Это отлично работает
ОБНОВИТЬ
ЗАДАВАТЬ
foo = B.bar
ОТ
Таблица А
ПРИСОЕДИНИТЬСЯ
Таблица B B A. A.col1 = B.colx
ГДЕ
...
UPDATE myTable
SET [Status] = 'Locked'
From myTable
WHERE id in (select TOP 5 * FROM myTable WHERE enabled=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;
Вы можете использовать предложение OUTPUT, чтобы сделать это в одном операторе без создания временной таблицы.
Обратитесь к этому сообщению за примерами.