MS SQL 서버에 있는 Oracle 시퀀스
오라클에는 시퀀스 번호를 생성하는 메커니즘이 있습니다. 예:
CREATE SEQUENCE supplier_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;
그리고 나서 그 진술을 실행합니다.
supplier_seq.nextval
다음 시퀀스 번호를 검색합니다.
MS SQL Server에서 동일한 기능을 어떻게 생성하시겠습니까?
편집: 테이블 레코드의 키를 자동으로 생성하는 방법을 찾고 있지 않습니다.프로세스의 (논리적) ID로 사용할 수 있는 고유한 값을 생성해야 합니다.따라서 Oracle이 제공하는 정확한 기능이 필요합니다.
정확한 일치는 없습니다.
테이블을 생성하는 동안 데이터 유형으로 설정할 수 있는 IDITY가 해당됩니다.SQLSERVER는 삽입하는 동안 실행 시퀀스 번호를 자동으로 만듭니다.마지막으로 삽입된 값은 SCOPE_IDENTITY()를 호출하거나 시스템 변수 @@IDENTITY를 참조하여 얻을 수 있습니다(Frans의 지적대로).
동일한 값이 필요한 경우 테이블을 만든 다음 다음 다음 값과 다른 작업을 다시 수행하는 절차를 작성해야 합니다.이에 대한 위험에 대한 마크 응답을 참조하십시오.
SQL Server는 Oracle과 유사한 Sequence를 구현했습니다.자세한 내용은 이 질문을 참조하십시오.
Microsoft SQL Server에서 시퀀스를 어떻게 구현하시겠습니까?
ID는 가장 우수하고 확장성이 높은 솔루션이지만 00A, 00B, 00C와 같이 증분이 아닌 시퀀스가 필요한 경우 두 번째로 적합한 방법이 있습니다.올바르게 구현되면 확장이 정상이지만 잘못 구현되면 확장이 제대로 되지 않습니다.추천하기는 어렵지만, 당신이 하는 일은 다음과 같습니다.
- 테이블에 "다음 값"을 저장해야 합니다.테이블은 해당 값만 있는 단순한 행 하나의 열 테이블일 수 있습니다.시퀀스가 여러 개인 경우 테이블을 공유할 수 있지만 각 시퀀스에 대해 별도의 테이블이 있으면 경합이 줄어들 수 있습니다.
- 이 값이 1개의 간격으로 증가하는 단일 업데이트 문을 작성해야 합니다.업데이트를 저장된 프로시저에 저장하여 사용하기 쉽게 하고 다른 위치에서 코드로 반복되지 않도록 할 수 있습니다.
- 시퀀스를 올바르게 사용하여 적절하게 확장하려면(아니요, Identity :-) 두 가지가 필요합니다. a. 업데이트 문에는 이 정확한 문제에 대해 만들어진 특수 구문이 있으며, 이 구문은 단일 문에서 값을 증가시키고 반환합니다. b.트랜잭션을 시작하기 전에 트랜잭션 범위 밖에서 사용자 지정 시퀀스에서 값을 가져와야 합니다.ID가 확장되는 이유 중 하나입니다. 트랜잭션 범위에 관계없이 삽입 시도에 대해 새 값을 반환하지만 실패 시 롤백되지는 않습니다.즉, 차단되지 않으며, 실패한 트랜잭션에 대한 공백이 발생합니다.
특수 업데이트 구문은 버전에 따라 조금씩 다르지만, 요점은 변수와 업데이트를 동일한 문에 할당하는 것입니다.2008년 Itzik Ben-Gan은 다음과 같은 깔끔한 솔루션을 제공합니다. http://www.sqlmag.com/Articles/ArticleID/101339/101339.html?Ad=1
구식 2000 이상의 방법은 다음과 같습니다.
UPDATE SequenceTable SET @localVar = value = value + 5 -- 테일 엔드를 증분 논리로 변경합니다.
이렇게 하면 다음 값이 증가하고 반환됩니다.
만약 당신이 절대적으로 갭을 가질 수 없다면(그 요구 사항에 저항할 수 있다면:-) 기술적으로 당신의 나머지 트랜잭션 안에 그 업데이트나 프로를 넣는 것이 가능하지만, 모든 삽입이 이전의 것이 커밋되기를 기다리는 동안 당신은 큰 동시성을 갖게 됩니다.
저는 이 모든 것을 이지크에게서 배웠습니다.
필드를 ID 필드로 만듭니다.필드는 자동으로 값을 가져옵니다.SCOPE_IDENTITY()를 호출하거나 시스템 변수 @@IDENTITY를 참조하여 마지막으로 삽입한 값을 얻을 수 있습니다.
SCOPE_IDENTITY() 함수를 사용하는 것이 좋습니다.
Dheer가 말했듯이 정확한 일치는 절대 없습니다.이를 위해 고유한 절차를 구축하려고 하면 애플리케이션의 확장이 중단됩니다.
Oracle의 시퀀스는 확장성이 뛰어납니다.
네, 조금만 뒤로 빼겠습니다.만약 당신이 정말로 동시성에 초점을 맞추고 수열로 가능한 한 순서대로 숫자를 추출한다면, 당신은 기회가 있습니다.하지만 당신이 t-sql에 대해 처음부터 다소 익숙하지 않은 것처럼 보이기 때문에, 저는 (오라클 앱을 MSS로 포팅하는 것이 당신이 하고 있는 일인가요?) 때 다른 옵션들을 찾기 시작할 것입니다.
예를 들어, "nextval" 함수에서 GUID를 생성하면 됩니다.그것은 확장될 것입니다.
그리고 캐시에서 최대값을 유지하기 위해 모든 값에 대해 테이블을 사용하지 마십시오.고유한 값을 제공하려면 이 값을 잠가야 합니다. 그러면 확장을 중지할 수 있습니다.메모리의 값을 캐시하고 테이블 잠금이 아닌 가벼운 잠금 장치에 프로그래밍 방식으로 액세스할 수 있는 방법이 있는지 알아내야 합니다.
SQL Server에 이 기능이 있으면 좋겠습니다.그것은 많은 것들을 더 쉽게 만들 것입니다.
이것이 제가 이 문제를 해결한 방법입니다.
tblIdentity라는 테이블을 만듭니다.이 표에는 최소값과 최대값이 포함된 행과 시퀀스 번호를 재설정해야 하는 빈도가 나와 있습니다.새 테이블의 이름도 입력합니다(tblMySeqNum이라고 함).이렇게 하면 나중에 시퀀스 번호 생성기를 더 쉽게 추가할 수 있습니다.
tblMySeqNum에는 두 개의 열이 있습니다.ID(int ID) 및 InsertDate(기본값이 GetDate()인 날짜 시간 열).
새 시퀀스 번호가 필요한 경우 이 테이블에 삽입하는 프로시저를 호출하고 SCOPE_IDENITY()를 사용하여 ID를 생성합니다.max intblIdentity를 초과하지 않았는지 확인합니다.오류가 있는 경우 오류를 반환합니다.그렇지 않으면 시퀀스 번호를 반환합니다.
이제 초기화하고 정리합니다.tblIdentites에 나열된 모든 테이블(현재는 하나만)을 재설정해야 하는지 확인하는 작업을 필요한 만큼 정기적으로 실행합니다.재설정 값 또는 시간에 도달한 경우 행에 나열된 테이블의 이름(이 예에서는 tblMySeqNum)에서 DBCC IDENT RESED를 호출합니다.이 시간은 해당 테이블에 필요하지 않은 추가 행을 정리할 수 있는 좋은 시간이기도 합니다.
ID를 가져오는 저장 프로시저에서 정리 또는 재시딩을 수행하지 마십시오.이렇게 하면 시퀀스 번호 생성기의 배율이 전혀 조정되지 않습니다.
앞서 말씀드렸듯이 SQL Server에서 이 기능을 사용하면 훨씬 더 쉽게 사용할 수 있습니다. 하지만 이 문제에 대한 해결 방법이 상당히 잘 작동한다는 것을 알게 되었습니다.
바카노
SQL Server 2012로 업데이트할 수 있는 경우 SEQUENCE 개체를 사용할 수 있습니다.SQL Server 2012 Express에서도 시퀀스를 지원합니다.
CREATE SEQUENCE supplier_seq
AS DECIMAL(38)
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;
SELECT NEXT VALUE FOR supplier_seq
SELECT NEXT VALUE FOR supplier_seq
SELECT NEXT VALUE FOR supplier_seq
SELECT NEXT VALUE FOR supplier_seq
SELECT NEXT VALUE FOR supplier_seq
결과:
---------------------------------------
1
(1 row(s) affected)
---------------------------------------
2
(1 row(s) affected)
---------------------------------------
3
(1 row(s) affected)
---------------------------------------
4
(1 row(s) affected)
---------------------------------------
5
(1 row(s) affected)
올바른 데이터 유형을 지정하도록 주의하십시오.만약 제가 그것을 지정하지 않았다면, 당신이 제공한 MAXVALUE는 받아들여지지 않을 것입니다. 그래서 저는 가능한 한 높은 정밀도로 DECTION을 사용했습니다.
Sequences에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/ff878091.aspx 을 참조하십시오.
이미 오래 전에 답이 있었을 수도 있습니다.하지만 SQL 2005 이후에는ROW_NUMBER
함수...예를 들어 다음과 같습니다.
select ROW_NUMBER() OVER (ORDER BY productID) as DynamicRowNumber, xxxxxx,xxxxx
그OVER
문은 다음을 사용합니다.ORDER BY
내 경우에 유일한 기본 키는...
이게 도움이 되길...더 이상의 임시 테이블이나 이상한 조인은 없습니다!!
정답은 아니지만 2012년에 SQL Server에 시퀀스가 제공될 것으로 보입니다.
http://www.sql-server-performance.com/2011/sequence-sql-server-2011/
정확한 답변은 아니지만 기존 답변에 추가됨
SCOPE_IDENTITY, IDENT_CURRENT 및 @@IDENTITY는 ID 열에 삽입된 값을 반환하므로 유사한 함수입니다.
IDENT_CURRENT는 범위와 세션에 의해 제한되지 않으며 지정된 테이블로 제한됩니다.IDENT_CURRENT는 모든 세션 및 범위의 특정 테이블에 대해 생성된 값을 반환합니다.자세한 내용은 IDENT_CURRENT(Transact-SQL)를 참조하십시오.
, 두 개의 세션이 이나 시퀀스 수 를 얻을 수 있습니다. 즉 두 개 서 다 로 의 ID 값 있 로 므 으 수 이 모 방 세 서 고 있 사 수 에 다 니 얻 습 번 고 을 를 션 든 는 되 용 호 유 하 지 를 퀀 스 시 호 질 를 는 번 또 가 른 세 션 이 한 IDENT_CURRENT
정확히 이 IDENT_CURRENT 때문에 스코프와 세션에 의해 제한되지 않고 지정된 테이블로 제한됩니다.스코프 ID는 세션에서 생성된 고유 번호를 제공하고 고유성은 ID 자체에 의해 제공되기 때문에 SCOPE_IDENTITY()를 사용해야 합니다.
언급URL : https://stackoverflow.com/questions/661998/oracle-sequence-but-then-in-ms-sql-server
'programing' 카테고리의 다른 글
스프링 REST 및 PATCH 방법 (0) | 2023.07.21 |
---|---|
MockMvc가 항상 빈 콘텐츠()를 반환하는 이유는 무엇입니까? (0) | 2023.07.21 |
셀러리에서 작업 상태를 확인하는 방법은 무엇입니까? (0) | 2023.07.21 |
SqlAlchemy를 사용하여 id별로 데이터베이스를 쿼리하는 방법은 무엇입니까? (0) | 2023.07.21 |
파이썬에서 현재 날짜 시간의 문자열 형식을 가져오려면 어떻게 해야 합니까? (0) | 2023.07.21 |