2011-08-17 4 views
1

SQL Server 기능 dbo.GetNextNumber()을 사용하여 각 호출에 대해 일련 번호를 생성하고 싶습니다. 내가 이해하는 한, SQL Server가 함수가 결정 론적이라고 주장 할 때 네이티브 T-SQL 함수로는 불가능합니다. 하지만이 일을하는 고유 한 T-SQL 함수를 제게 보여 주면 정말로 제 하루가 걸릴 것입니다.일련 번호를 생성하는 SQL Server 기능

아마도 CLR 기능을 사용하여이 기능을 작성할 수 있다고 생각했습니다. CLR 함수는 정적이므로 시퀀스 변수를 set 변수의 호출 컨텍스트에 저장해야합니다. 정적 변수로 저장하면 동일한 시퀀스를 사용하여 여러 연결이 이루어지며 결과적으로 숫자가 일치하지 않게됩니다. set 오퍼레이션 (선택, 업데이트, 삭제, 삽입) 호출 컨텍스트에 CLR 측에서 도달 할 수 있는지 확인하기 위해 포함 된 CLR에 대해 충분히 알지 못합니다. 하루의 끝에서

,

select dbo.GetNextNumber() from sysobjects 

가 결과를 반환해야 다음 쿼리

1 
2 
3 
4 
5 

다른 함수 호출 문맥

exec dbo.ResetSequenceNumbers() 
처럼 필요가 재설정 경우는 OK입니다

오해를 예방하고 잘못된 탐색에 시간을 낭비 할 가능성을 줄이려면 이온, 나는 테이블 생성을위한 ID 생성 기능을 찾고 있지 않으며 ID 컬럼이있는 임시 테이블을 포함하는 해킹 (함수가 아니라 proc을 사용하기는하지만)을 알고 있습니다. ROW_NUMBER() 기능은 비슷하지만 잘리지 않습니다. 어떤 응답

에 대한 많은 케말

P.S.

감사합니다 SQL Server에 내장 된 기능이 있다는 것은 놀라운 일입니다. 함수 (조인과 where 절에서 사용할 수없는 경우)는 정말 쉽고 매우 유용하지만 어떤 이유로 그것이 포함되지 않습니다.

+7

"SQL 서버 기능 dbo.GetNextNumber()"를 묻지 말고 실제로 해결하려고하는 문제를 알려주십시오. –

+1

'ID INT IDENTITY (1,1)'열이 하나만있는 "도우미"테이블을 사용하고 각 INSERT 후에 (SELECT SCOPE_IDENTITY()를 사용하여) 값을 가져 오거나 SQL Server "Denali" "(2011/2012)는 [SEQUENCES를 기본 데이터베이스 개체로 사용]합니다 (http://sqlblog.com/blogs/aaron_bertrand/archive/2010/11/11/sql-server-11-denali-using-sequence.aspx) –

+1

SQL 서버 기능이 결정적 일 필요는 없습니다. 경우에 따라 결정적 함수가 필요합니다 (예 : 계산 된 열). –

답변

5

에서 더미 레코드를 삽입한다 ROW_NUBER() 기능을 사용하여 동일하게 달성 할 수 있습니다.

ROW_NUMBER() 기능은 그러나 ORDER BY에 의한 분류 피하기 위해 어떻게 좋은 해결 방법은의 OVER 절에 ORDER BY이 필요합니다. 에 의해 순서에 표현을 넣을 수는 없지만 거기에 SELECT aConstant을 넣을 수 있습니다. 따라서 다음 문장을 사용하여 숫자 생성을 쉽게 달성 할 수 있습니다.

SELECT 
    ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNumber, 
    * 
FROM aTable 
+0

와우, 정말 좋은 해킹. 고맙습니다 –

2

SQL Server의 다음 버전에서는이를 수행하기 위해 SEQUENCE를 사용할 수 있습니다. 이전 버전에서는 별도의 "시퀀스 테이블"(IDENTITY 열만있는 테이블)에 삽입 한 다음 SCOPE_IDENTITY() 함수를 사용하여 값을 검색하면됩니다. 함수에서는 그렇게 할 수 없지만 저장 프로 시저를 사용할 수는 있습니다.

+0

SQL Server는 함수에서이 논리를 캡슐화하지 못하기 때문에이 작업을 수행하지 않습니다. 아마, 나는 그것을 수행하기 위해 CLR 함수를 생성해야합니다. 하지만 이것은 해킹이 될 것이고 우아한 해결책이 될 수는 없을 것입니다. –

+0

모두가 알고 싶어하는 것은 프로 시저가 아닌 함수에서이 작업을하는 것이 왜 중요한지입니다. 의도하지 않은 기능에 함수를 사용하려고합니다. – sqlvogel

2

ROW_NUMBER()이 왜 자르지 않는지에 대한 자세한 정보를 제공 할 수 있습니까? 구체적인 예를 들어, ROW_NUMBER() (적절한 해설이 OVER(ORDER BY) 인 경우)이 귀하의 기준과 일치하는 것으로 보입니다.

그러나 확실한 경우는 ROW_NUMBER()이 유용하지 않을 수 있으며, 그러한 경우 일반적으로 다른 기술이 있습니다.

아마도이 일반적인 기능을 사용하는 것이 유용 할 것 같지만 대부분의 경우 문제가있는 곳에서 해결할 수있는 해결책은 일반적인 목적의 기능보다 더 좋은 아이디어인데 더 많은 어려움을 유발합니다. 예를 들어 새는 추상화 당신은 끊임없이 노력하고 있습니다. 특히 리셋 기능이 필요하다는 점을 언급하십시오. 그룹화를 지정할 수있는 OVER(PARTITION BY ORDER BY)이있는 경우 ROW_NUMBER()과 같은 것은 필요하지 않습니다.

+0

row_number에는 order by 절을 지정하도록하는 over 술어가 필요합니다. 필자의 경우에는 자연 순서가 중요한 임시 테이블에 대해이 함수가 필요합니다. 그리고 일부 경우에는 런타임에 알 수없는 열을 지정하여 동적 SQL을 사용해야합니다. 마지막으로 row_number()의 값을 사용하려면 모든 것을 서브 쿼리로 래핑해야합니다. 별로 좋지 않다. –

+2

@Kemal Erdogan SQL에는 자연 순서가 없다. 게재 신청서 나 클러스터 된 색인 또는 다른 어떤 것에 의존하는 경우 ORDER BY 없이는 보장 된 주문이 없습니다. 주문을 받아서 신뢰할 수있는 것처럼 보이지만 ORDER BY 없이는 보장 된 것이 없습니다. SQL은 선언적 언어이며 선언이나 욕망이 없으면 아무 것도 보장되지 않습니다. –

+0

SQL 이론에는 자연 순서와 같은 것이 없습니다. 그러나 힙 테이블에 대한 삽입을 구현하는 가장 단순하고 자연스러운 방법은 삽입 순서를 그대로 유지하는 것입니다. 이것이 바로 마이크로 소프트가 결코 변경하지 않은 이유이며, 마이크로 소프트가 변경 될 이유는 없습니다. 따라서 실제로는 자연 순서와 같은 것이 있습니다. –

0

SQL 서버 데날리 관리하고 데날리 이외의 다른 버전 Sequence Numbers in SQL Server

에서 자세한 내용을 확인할 수 있습니다 데날리 후 SQL Server의 일련 번호를 유지하기가 용이 개발자 에 대한 새로운 시퀀스 구조를 가지고, 당신은 순서를 사용할 수 있습니다 표. 당신이 실행 합계의 계산에 관한 나의 기사를 기반으로 CLR 순서를 구현 한 여기 순서 테이블에서 일련 번호를 읽기위한 Sequence Table in SQL Server 에 대한 샘플, 당신이 자동 식별 가능 SQL 테이블