2014-10-28 3 views
0

열이 ID 인 테이블이 있고 varchar (255) 및 done 비트가 있습니다. 첫 번째 ID을 가져오고 싶습니다. 여기서 비트는 설정되지 않았고 페칭도 비트를 설정합니다. 따라서 스크립트의 다른 인스턴스는 동일한 ID을 사용하며 경쟁 조건은 없습니다.MSSQL에서 한 번의 작업으로 업데이트 및 선택

import _mssql 
con = _mssql.connect(server='server', user='user', password='password', database='default') 

#these two in a single command 
con.execute_query('SELECT TOP 1 ID FROM tableA WHERE done=0') 
con.execute_query('UPDATE tableA SET done=1 WHERE ID=\''+id_from_above+'\'') 
for row in con: 
    #row['ID'] contains nothing as it last used with the UPDATE, not the SELECT 
    start_function(row['ID']) 
(wewesthemenace의 제안 포함)

편집 :

[...] 
con.execute_query('UPDATE tableA SET done = 1 WHERE ID = (SELECT TOP 1 ID FROM tableA WHERE done = 0)') 
for row in con: 
    #row['ID'] contains nothing as it last used with the UPDATE, not the SELECT 
    start_function(row['ID']) 

마이크로 소프트 SQL 서버 엔터프라이즈 에디션 v9.00.3042.00에서 작업, 즉 SQL Server 2005 서비스 팩 2

편집 2 :
답변 된 질문은 다음 질문으로 연결됩니다. While mssql query returns an affected ID use it in a while loop

+1

** 거래 ** 및 ** 행 잠금 **을 살펴보고 싶습니다. "execute_query()'에서 두 쿼리를 모두 처리하는 것은 쉽지 않습니다."_ solution (afaik). 내가 발견 한 좋은 소개는 ** [this technet article] (http://technet.microsoft.com/ko-kr/library/jj856598(v=sql.110).aspx) **이며, ** ACID ** etc. – funkwurm

+0

하나의 execute_quer()를 사용하여 솔루션을 얻었습니다. 질문을 편집하고 지금 내 솔루션을 추가 할 것입니다. 그러나 링크에 대해 대단히 감사합니다. –

답변

0

가능한 해결 방법.

con.execute_query('UPDATE tableA SET done=1 OUTPUT INSERTED.ID WHERE ID=(SELECT TOP(1) ID FROM tableA WHERE done=0)') 
for row in con: 
    #row['ID'] is exactly one ID where the done bit wasn't set, but now is. 
    start_function(row['ID']) 
1

어때요? 내 상황에서 작동

UPDATE tableA SET done = 1 WHERE ID = (SELECT TOP 1 ID FROM tableA WHERE done = 0) 
+0

잘 보입니다. 그러나 나는'con : start_function (row [ 'ID'])'행에서'for '할 수 없다고 가정합니다. 자신을 명확히하기 위해, 그것이해야 할 일을하지만, ID를 얻지는 않습니다. –

관련 문제