我有一个存储过程,我将根据条件选择一些行,我需要更新同一存储过程中这些行的状态。 例如,
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#中获取了所需的行,但存储过程中的更新查询无法正常工作。 任何人都可以在我出错的地方提出一些建议。
答案 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。