복붙노트

[SQL] SQL 서버에서 오라클의 ROWID의 등가

SQL

SQL 서버에서 오라클의 ROWID의 등가

SQL 서버에서 오라클의 ROWID의 상응하는 무엇입니까?

해결법

  1. ==============================

    1.오라클 문서에서

    오라클 문서에서

    SQL 서버에서이 가장 가까운 해당하는 세 가지 구성 요소 파일이 어느 제거입니다 : 페이지 : 슬롯.

    SQL 서버 2008에서는이 볼 수 문서화되지 않은 및 지원되지 않는 %%의 physloc %% 가상 열을 사용하는 것이 가능하다. 이 리턴 처음 4 바이트의 페이지 ID와 이진 (8)의 값은, 다음 파일 ID가 2 바이트의 페이지 슬롯 위치는 2 바이트 하였다.

    스칼라 함수 sys.fn_PhysLocFormatter 또는 sys.fn_PhysLocCracker TVF 더 읽을 수있는 형태로 변환이 사용될 수있다

    CREATE TABLE T(X INT);
    
    INSERT INTO T VALUES(1),(2)
    
    SELECT %%physloc%% AS [%%physloc%%],
           sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot]
    FROM T
    

    예제 출력

    +--------------------+----------------+
    |    %%physloc%%     | File:Page:Slot |
    +--------------------+----------------+
    | 0x2926020001000000 | (1:140841:0)   |
    | 0x2926020001000100 | (1:140841:1)   |
    +--------------------+----------------+
    

    이 쿼리 프로세서가 활용되지 않습니다. WHERE 절에서 이것을 사용할 수 있습니다 동안

    SELECT *
    FROM T
    WHERE %%physloc%% = 0x2926020001000100 
    

    SQL 서버에 직접 지정된 행에 추구하지 않습니다. 대신이 일치 (있는 경우 DO) 그 하나를 테이블 전체를 스캔하는 각 행에 대한 %% physloc을 %% 평가하고 반환합니다.

    앞서 언급 한 2 개 함수에 의해 수행되는 프로세스를 리버스 진을 얻기 위해 (8)의 값이 공지 된 파일에 대응하는 페이지 슬롯은 아래 사용될 수 값.

    DECLARE @FileId int = 1,
            @PageId int = 338,
            @Slot   int = 3
    
    SELECT CAST(REVERSE(CAST(@PageId AS BINARY(4))) AS BINARY(4)) +
           CAST(REVERSE(CAST(@FileId AS BINARY(2))) AS BINARY(2)) +
           CAST(REVERSE(CAST(@Slot   AS BINARY(2))) AS BINARY(2))
    
  2. ==============================

    2.당신이 유일하게 테이블이 아닌 당신의 결과 집합 내에서 행을 식별하고 싶은 경우에, 당신은 IDENTITY 열 같은 것을 사용하여보고해야합니다. 은 SQL Server 도움말에서 "IDENTITY 속성"을 참조하십시오. SQL 서버 그래서 당신은 당신의 자신의 ID 열을 만드는 문제로 이동 명시 적으로 쿼리를 가져올 수 있고, 오라클처럼 테이블의 각 행에 대한 ID를 자동으로 생성하지 않습니다.

    당신이 유일하게 테이블이 아닌 당신의 결과 집합 내에서 행을 식별하고 싶은 경우에, 당신은 IDENTITY 열 같은 것을 사용하여보고해야합니다. 은 SQL Server 도움말에서 "IDENTITY 속성"을 참조하십시오. SQL 서버 그래서 당신은 당신의 자신의 ID 열을 만드는 문제로 이동 명시 적으로 쿼리를 가져올 수 있고, 오라클처럼 테이블의 각 행에 대한 ID를 자동으로 생성하지 않습니다.

    편집 : 결과 집합 행의 동적 번호에 대한 아래를 참조하지만 오라클의 ROWNUM에 대한 동등한 아마 것 그리고 난 당신이 위의 물건을 원하는 페이지의 모든 코멘트에서 가정합니다. SQL 서버 2005과 나중에 행의 동적 번호를 달성하기 위해 새로운 순위 함수 기능을 사용할 수 있습니다.

    예를 들어 나는 내 쿼리에이 작업을 수행 :

    select row_number() over (order by rn_execution_date asc) as 'Row Number', rn_execution_date as 'Execution Date', count(*) as 'Count'
    from td.run
    where rn_execution_date >= '2009-05-19'
    group by rn_execution_date
    order by rn_execution_date asc
    

    당신에게 줄 것이다 :

    Row Number  Execution Date           Count
    ----------  -----------------        -----
    1          2009-05-19 00:00:00.000  280
    2          2009-05-20 00:00:00.000  269
    3          2009-05-21 00:00:00.000  279
    

    동적으로 번호 행에 support.microsoft.com에 대한 기사도 있습니다.

  3. ==============================

    3.나는 많은 열이 매우 큰 테이블을 중복 제거해야하고 속도가 중요하다. 따라서 나는 모든 테이블 작동이 방법을 사용 :

    나는 많은 열이 매우 큰 테이블을 중복 제거해야하고 속도가 중요하다. 따라서 나는 모든 테이블 작동이 방법을 사용 :

    delete T from 
    (select Row_Number() Over(Partition By BINARY_CHECKSUM(*) order by %%physloc%% ) As RowNumber, * From MyTable) T
    Where T.RowNumber > 1
    
  4. ==============================

    4.새로운 ROW_NUMBER 기능을 확인하십시오. 그것은 다음과 같이 작동합니다 :

    새로운 ROW_NUMBER 기능을 확인하십시오. 그것은 다음과 같이 작동합니다 :

    SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE
    
  5. ==============================

    5.답변 중 일부는 위의 특정 행에 대한 직접 참조의 부족을 해결할 것이다, 그러나 변화는 테이블의 다른 행에 발생하는 작업을하지 않을 경우. 그건 내 기준이되는 답변을 기술적으로 짧은 가을입니다.

    답변 중 일부는 위의 특정 행에 대한 직접 참조의 부족을 해결할 것이다, 그러나 변화는 테이블의 다른 행에 발생하는 작업을하지 않을 경우. 그건 내 기준이되는 답변을 기술적으로 짧은 가을입니다.

    오라클 ROWID의 일반적인 용도는 행을 선택하는 이상 (예를 업데이트하기 위해)을 처리하기 위해 로우로 복귀의 (다소) 안정 방법을 제공하는 것이다. 행을 찾는 방법 쉽게 또는 안전하게 UPDATE 문을 한정 - 재사용하지 않을 수 있습니다 (단지는 전체 텍스트 검색, 또는 행별로 행을 검색하고 데이터에 대한 절차 적 테스트를 적용, 조인).

    RID SQL 서버는 동일한 기능을 제공하는 것처럼 보이지만 동일한 성능을 제공하지 않습니다. 즉, 단지 내가 볼 문제입니다, 불행하게도 ROWID를 유지의 목적은 말에서 행, 매우 큰 테이블을 찾기 위해 비용이 많이 드는 작업을 반복하지 않도록하는 것입니다. 그럼에도 불구하고, 대부분의 경우 성능이 허용됩니다. 마이크로 소프트는 향후 릴리스의 최적화를 조정하면 성능 문제가 해결 될 수 있습니다.

    단순히 FOR UPDATE를 사용하고 절차 적 프로그램에 열려있는 커서를 유지하는 것이 가능하다. 그러나,이 크거나 복잡한 일괄 처리 비용이 증명할 수 있습니다.

    경고 :은 SELECT와 UPDATE 사이의 DBA는, 예를 들어, 데이터베이스를 다시한다면 그것은 물리적 인 행 식별자이기 때문에 심지어 오라클의 ROWID가 안정되지 않을 것입니다. 그래서 ROWID 디바이스는 잘 범위의 작업 내에서 사용되어야한다.

  6. ==============================

    6.당신은 어떻게 이런 일에 대한 작은 데이터 세트에 대한 기본 행 번호를 원한다면?

    당신은 어떻게 이런 일에 대한 작은 데이터 세트에 대한 기본 행 번호를 원한다면?

    SELECT row_number() OVER (order by getdate()) as ROWID, * FROM Employees
    
  7. ==============================

    7.http://vyaskn.tripod.com/programming_faq.htm#q17에서 :

    http://vyaskn.tripod.com/programming_faq.htm#q17에서 :

  8. ==============================

    8.영구적 번호로 테이블의 행을 원하는 경우, SQL Server에 대한 RID 솔루션을 사용하지 마십시오. SQL 서버는 단순히 클러스터 된 기본 키로 해당 열을 IDENTITY 열을 생성하고, 사용하기에 오래된 (386)에 액세스보다 더 수행합니다. 이 테이블에 영구적 빠른 정수 B-트리를 배치하며, 더 중요한 것은 모든 비 클러스터형 인덱스는 행을 찾는 데 사용됩니다. 그건 마치 당신이 SQL Server의 개발을 시도 할 경우 오라클 당신은 실적이 저조 데이터베이스를 만듭니다. 당신은 다른 엔진 척하지, 엔진 ​​최적화해야합니다.

    영구적 번호로 테이블의 행을 원하는 경우, SQL Server에 대한 RID 솔루션을 사용하지 마십시오. SQL 서버는 단순히 클러스터 된 기본 키로 해당 열을 IDENTITY 열을 생성하고, 사용하기에 오래된 (386)에 액세스보다 더 수행합니다. 이 테이블에 영구적 빠른 정수 B-트리를 배치하며, 더 중요한 것은 모든 비 클러스터형 인덱스는 행을 찾는 데 사용됩니다. 그건 마치 당신이 SQL Server의 개발을 시도 할 경우 오라클 당신은 실적이 저조 데이터베이스를 만듭니다. 당신은 다른 엔진 척하지, 엔진 ​​최적화해야합니다.

    또한, 당신은 삽입 성능을 죽일거야, GUID를 사용하여 기본 키를 채우려면 NEWID ()를 사용하지 마십시오. 당신이 사용해야하는 경우 GUID를 열 기본으로 NEWSEQUENTIALID ()를 사용합니다. 그러나 INT는 여전히 빠를 것이다.

    반면에, 당신은 단순히 숫자로 쿼리에서 쿼리 열 중 하나로서 ROWNUMBER 이상 () 함수를 사용하여 결과하는 행을 원한다.

  9. ==============================

    9.시도하십시오

    시도하십시오

    () 변경을 선택

    출처 : https://docs.microsoft.com/en-us/sql/t-sql/data-types/uniqueidentifier-transact-sql

  10. ==============================

    10.ROWID는 SQL Server에 대한 때문에, Oracle 테이블에 숨겨진 열입니다 자신을 구축 할 수 있습니다. NEWID의 기본 값으로 ROWID라는 컬럼을 추가합니다 ().

    ROWID는 SQL Server에 대한 때문에, Oracle 테이블에 숨겨진 열입니다 자신을 구축 할 수 있습니다. NEWID의 기본 값으로 ROWID라는 컬럼을 추가합니다 ().

    이 작업을 수행하는 방법 : SQL Server의 기존 테이블에 기본 값으로, 열을 추가

  11. ==============================

    11.http://msdn.microsoft.com/en-us/library/aa260631(v=SQL.80).aspx를 참조하십시오 SQL 서버에서 타임 스탬프는 날짜 시간 컬럼과 동일하지 않습니다. 이 고유 데이터베이스의 테이블 있지만 전체 데이터베이스 단지를 행을 식별하는 데 사용됩니다. 이것은 낙관적 동시성 사용할 수 있습니다. 예를 들면 UPDATE [작업] SET [이름] = @ 이름, [XCustomData] = @ XCustomData WHERE ([ModifiedTimeStamp] = @ Original_ModifiedTimeStamp 및 [GUID] = @ Original_GUID

    http://msdn.microsoft.com/en-us/library/aa260631(v=SQL.80).aspx를 참조하십시오 SQL 서버에서 타임 스탬프는 날짜 시간 컬럼과 동일하지 않습니다. 이 고유 데이터베이스의 테이블 있지만 전체 데이터베이스 단지를 행을 식별하는 데 사용됩니다. 이것은 낙관적 동시성 사용할 수 있습니다. 예를 들면 UPDATE [작업] SET [이름] = @ 이름, [XCustomData] = @ XCustomData WHERE ([ModifiedTimeStamp] = @ Original_ModifiedTimeStamp 및 [GUID] = @ Original_GUID

    ModifiedTimeStamp는 원래 데이터를 업데이트하고 다른 업데이트는 행 발생한 경우 실패 할 것을 보장한다.

  12. ==============================

    12.나는 MS SQL의 예에서이 예제를했다 당신은 @ID는 정수 또는 VARCHAR 또는 무엇과 교환 할 수 있습니다 볼 수 있습니다. 이것은 내가 찾고 있었던 동일한 솔루션, 그래서 그것을 공유하고 있습니다. 즐겨!!

    나는 MS SQL의 예에서이 예제를했다 당신은 @ID는 정수 또는 VARCHAR 또는 무엇과 교환 할 수 있습니다 볼 수 있습니다. 이것은 내가 찾고 있었던 동일한 솔루션, 그래서 그것을 공유하고 있습니다. 즐겨!!

    -- UPDATE statement with CTE references that are correctly matched.
    DECLARE @x TABLE (ID int, Stad int, Value int, ison bit);
    INSERT @x VALUES (1, 0, 10, 0), (2, 1, 20, 0), (6, 0, 40, 0), (4, 1, 50, 0), (5, 3, 60, 0), (9, 6, 20, 0), (7, 5, 10, 0), (8, 8, 220, 0);
    DECLARE @Error int;
    DECLARE @id int;
    
    WITH cte AS (SELECT top 1 * FROM @x WHERE Stad=6)
    UPDATE x -- cte is referenced by the alias.
    SET ison=1, @id=x.ID
    FROM cte AS x
    
    SELECT *, @id as 'random' from @x
    GO
    
  13. ==============================

    13.당신은 아래의 방법을 사용하여 ROWID를 얻을 수 있습니다 :

    당신은 아래의 방법을 사용하여 ROWID를 얻을 수 있습니다 :

    거기에 자동 증가 필드 새 테이블을 1.Create

    당신이 당신이 분야의 특정 필드 또는 조합 방식으로 오름차순 또는 내림차순에 ROW_ID를하려는 상황에서 도움이되기 때문에 구석 구석 ROW_NUMBER 분석 기능은 순서이 선호 당신의 requirement.I에 따라하세요

    샘플 : ROW_NUMBER () 이상 (샐 내림차순으로 DEPTNO 순서에 의해 분할)

    선택 사항으로 위 샘플은 각 department.Partition의 가장 높은 급여에 따라 당신에게 일련 번호를 줄 것이다 당신은 당신의 요구 사항에 따라 제거 할 수 있습니다

  14. from https://stackoverflow.com/questions/909155/equivalent-of-oracles-rowid-in-sql-server by cc-by-sa and MIT license