답변:
UPDATE 문에는 괄호가 필요합니다.
update top (100) table1 set field1 = 1
없이 ORDER BY전체 아이디어는 TOP많은 이해가되지 않습니다. top의 개념이 의미가 있으려면 어느 방향이 "위"이고 어떤 방향이 "아래"인지에 대한 일관된 정의가 필요합니다.
그럼에도 불구하고 SQL Server는이를 허용하지만 결정적인 결과를 보장하지는 않습니다 .
UPDATE TOP허용 된 답변 의 구문은 ORDER BY절을 지원하지 않지만 CTE 또는 파생 테이블을 사용하여 다음과 같이 원하는 정렬 순서를 정의하여 결정 론적 의미를 얻을 수 있습니다.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP확률을 사용할 때 ORDER BY관심있는 것이 "가장" "최소한"것과 같기 때문에 함께 사용해야한다는 것을 인정한다 . 그러나 다른 경우에는 일치하는 레코드를 하나만 얻는 데 관심이있을 수 있습니다. 오늘 나처럼! 한 번에 하나씩 데이터 문제 (사이클)를 수정해야했습니다. 전체 수정 프로세스에는 db 스크립트, 일부 사용자 개입 및 일부 응용 프로그램 작업이 포함되었습니다. 우리는 WHICH 기록이 먼저 처리되는 것을 신경 쓰지 않았습니다. 우리는 방금 한 번에 하나씩 처리하고 있다고 생각했습니다.
WHERE이전에 처리 된 레코드를 제외 하는 조항 이 있었을 것 입니다. 서면 답변과 대답은 의미가 없습니다. BTW : 테이블을 대기열로 사용하는 경우 이는 매우 유용한 링크입니다.
where동일한 행을 반복해서 처리하지 않으려면 절이 필요 합니다.
나와 같은 사람들은 여전히 SQL Server 2000을 고수 SET ROWCOUNT {number};하고 UPDATE쿼리 전에 사용할 수 있습니다.
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
업데이트를 100 행으로 제한합니다
SQL 2005부터는 더 이상 사용되지 않지만 SQL 2017에서는 여전히 작동합니다. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
더 멋진 점은 인라인 테이블 반환 함수를 사용하여 업데이트 할 (및 비아 TOP) 행 을 선택할 수 있다는 것 입니다. 그건:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
테이블 반환 함수의 경우 다음과 같이 업데이트 할 행을 선택하는 것이 좋습니다.
CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria
(
@Param1 INT,
@Param2 INT,
@Param3 INT
)
RETURNS TABLE AS RETURN
(
SELECT TOP(1) MyTable.*
FROM MyTable
JOIN MyOtherTable
ON ...
JOIN WhoKnowsWhatElse
ON ...
WHERE MyTable.SomeColumn=@Param1 AND ...
ORDER BY MyTable.SomeDate DESC
)
... 그리고 (내 겸손한 견해로는) 선택된 상위 행만 결정 론적으로 업데이트하면서 동시에 UPDATE명령문 의 구문을 단순화하는 진정한 힘이 있습니다.
시험:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
order by도 잘 알고 있습니까?