답변:
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
도 잘 알고 있습니까?