문제

데이터를 삽입하는 SQL 스크립트가 있습니다 (현재 수천 개로 번호가 매겨진 INSERT 문을 통해) 열 중 하나에는 몇 가지 다른 항목에서 실제로 고유 한 고유 식별자 (IDENTITY 유형이 아닌 일반 ol 'int)가 있습니다. 테이블.

다음 사용 가능한 ID (예 : 마지막으로 사용한 ID + 1)를 가져 오는 스칼라 함수를 스크립트에 추가하고 싶지만 사용 방법이없는 것 같아서 이것이 가능한지 확신 할 수 없습니다. UDF 내에서 전역 또는 정적 변수를 사용하는 경우 임시 테이블을 사용할 수 없으며 함수 내에서 영구 테이블을 업데이트 할 수 없습니다.

현재 내 스크립트는 다음과 같습니다. 라코 디스

하지만 다음과 같이 표시하고 싶습니다. 라코 디스

오프셋을 하드 코딩하는 것은 엉덩이에 고통스럽고 오류가 발생하기 쉽습니다. 간단한 스칼라 함수로 패키징하는 것은 매우 매력적이지만 호출 사이에 오프셋 카운터를 유지하는 방법이없는 것 같기 때문에 그렇게 할 수 없다고 생각하기 시작했습니다. 그게 맞습니까, 아니면 내가 놓친 것이 있습니까?

현재 SQL Server 2005를 사용하고 있습니다.

설명 수정 :

두 명의 사용자가 타격을 입는 일은 발생하지 않습니다. 이것은 한 번만 실행되고 동시에 실행되지 않는 업그레이드 스크립트입니다.

실제 sproc는 sp_로 시작하지 않고 예제 코드를 수정했습니다.

일반적인 사용에서는 필요에 따라 ID 테이블과 sproc을 사용하여 ID를 얻습니다. 저는이 스크립트에서 작업을 수행하는 더 깨끗한 방법을 찾고있었습니다.이 스크립트는 기본적으로 많은 데이터를 db에 덤프합니다.

도움이 되었습니까?

해결책

<인용구>

호출 사이에 오프셋 카운터를 유지할 방법이없는 것 같아서 그렇게 할 수 없다고 생각하기 시작했습니다.맞습니까, 아니면 제가 놓친 것이 있습니까?

누락 된 것이 없습니다.SQL Server는 전역 변수를 지원하지 않으며 UDF 내에서 데이터 수정을 지원하지 않습니다.CONTEXT_INFO ( http://weblogs.sqlteam.com/mladenp/archive/2007/04/23/60185.aspx ), 어쨌든 UDF 내에서 설정할 수 없습니다.

오프셋을 변수로 만들고 반복을 반복하고 해당 루프 내에서 삽입을 수행하여 오프셋의 "하드 코딩"을 우회 할 수있는 방법이 있습니까?

다른 팁

2 명의 사용자가 동시에 공격하는 경우 동일한 ID를 받게됩니다.대신 ID가있는 ID 테이블을 사용하지 않은 이유는 무엇입니까? 여기에 삽입하여 고유 한 (보장 된) ID로 사용하면 훨씬 빠르게 수행됩니다. <인용구> <인용구>

sp_getNextID

procs에 sp_ 접두사를 붙이지 마십시오. 최적화 프로그램이 먼저 마스터 DB를 확인하여 해당 proc이 있는지 확인한 다음 로컬 DB를 확인하고 MS가 서비스 팩에 sp_getNextID를 생성하기로 결정한 경우에도 성능에 영향을 미칩니다.처형 당하다

아마 가치가있는 것보다 더 많은 작업이 될 수 있지만 SQL CLR UDF에서 정적 C # / VB 변수를 사용할 수 있으므로 매번이 변수를 간단히 증가 시키면 원하는 작업을 수행 할 수있을 것입니다.UDF가 호출됩니다.물론 정적 변수는 appdomain이 언로드 될 때마다 손실됩니다.따라서 하루에서 다음 날까지 ID의 연속성이 필요한 경우 NextId에 처음 액세스 할 때이 ID를 사용하는 모든 테이블을 폴링하여 가장 높은 값을 찾을 수있는 방법이 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top