상황/목표 :사용
I는 1 내지 [INT_MAX (SEQ_A, SEQ_B, SEQ_C) 내지 3 개의 정수 시퀀스를 가지고 있고 테이블의 값을 기록하고 싶었 함수를 사용하여 두 시퀀스 중 하나의 숫자 범위를 가져옵니다. 내가 왜이 일을하고
CREATE FUNCTION [dbo].[GetSequenceNumber]
(
@TabelField VARCHAR(256),
@Range INT
)
RETURNS @RETVALTABLE TABLE
(
SEQUENCE_NUMBER INT
)
AS
BEGIN
IF(ISNULL(@Range, 0) <= 0 OR @TabelField IS NULL)
RETURN;
DECLARE @FirstSeqNum sql_variant;
DECLARE @LastSeqNum sql_variant;
DECLARE @FirstSequenceNumber as INT;
DECLARE @LastSequenceNumber as INT;
IF @TabelField = 'FIELD_A' BEGIN
EXEC sys.sp_sequence_get_range N'SEQ_A', @Range, @FirstSeqNum OUTPUT, @LastSeqNum OUTPUT;
SET @FirstSequenceNumber = CONVERT(INT, @FirstSeqNum);
SET @LastSequenceNumber = CONVERT(INT, @LastSeqNum);
WHILE @FirstSequenceNumber <= @LastSequenceNumber BEGIN
INSERT INTO @RETVALTABLE SELECT @FirstSequenceNumber;
SET @FirstSequenceNumber += 1;
END
END
ELSE IF @TabelField = 'FIELD_B' BEGIN
EXEC sys.sp_sequence_get_range N'SEQ_B', @Range, @FirstSeqNum OUTPUT, @LastSeqNum OUTPUT;
SET @FirstSequenceNumber = CONVERT(INT, @FirstSeqNum);
SET @LastSequenceNumber = CONVERT(INT, @LastSeqNum);
WHILE @FirstSequenceNumber <= @LastSequenceNumber BEGIN
INSERT INTO @RETVALTABLE SELECT @FirstSequenceNumber;
SET @FirstSequenceNumber += 1;
END
END
ELSE IF @TabelField = 'FIELD_C' BEGIN
EXEC sys.sp_sequence_get_range N'SEQ_C', @Range, @FirstSeqNum OUTPUT, @LastSeqNum OUTPUT;
SET @FirstSequenceNumber = CONVERT(INT, @FirstSeqNum);
SET @LastSequenceNumber = CONVERT(INT, @LastSeqNum);
WHILE @FirstSequenceNumber <= @LastSequenceNumber BEGIN
INSERT INTO @RETVALTABLE SELECT @FirstSequenceNumber;
SET @FirstSequenceNumber += 1;
END
END
RETURN
END
:
- 내가 바람직 테이블 와 같은 특정 범위에서 모든 숫자를 원하는 (SYS는 달리
이
내가 생각 해낸 코드입니다 .sp_sequence_get_range는 첫 번째 숫자를주고 마지막 숫자는 입니다. - 시퀀스 이름은 신경 쓰지 않습니다. 번호 필드를 원하는 필드의 테이블 기능을 "알 수 있습니다"
- @RETVALTABLE에 시퀀스 번호를 삽입하기 전에 몇 가지 추가 검사를 할 수 있습니다 (예 : 일부 숫자는 건너 뛰기).
문제 :
나는 그것을 변경할 수 있습니다, 기능을 만들 수 있지만 나는 그것을 실행할 수 없습니다. 함수를 호출 할 때 항상 오류가 발생합니다. "함수 및 특정 확장 저장 프로 시저 만 함수 내에서 실행할 수 있습니다."
글쎄,이 오류는 매우 자체 설명하고 문제는 아마도 EXEC sys.sp_sequence_get_range N'SEQ_X', @Range, @FirstSeqNum OUTPUT, @LastSeqNum OUTPUT;
부분입니다.
질문 : 오류를 제거하려면 어떻게
? 테이블 값 함수를 사용하는 것보다 목표를 달성하는 더 좋은 방법이 있습니까?
여기에서 최우선 순위는 특정 순서 (시작과 끝 지점뿐만 아니라)의 특정 범위에서 모든 숫자를 얻는 것입니다.
, MSSQL은 함수 내에서 시저를 호출에 대한 즉시 고함 시작 (OUTPUT
키워드를 멈추지 않았다합니다 (SPROC에 대한 호출에 점점없이
감사합니다.하지만 제 문제에 대한 부분적인 해결책 일뿐입니다. 제공 한 기능을 사용하면 시퀀스 자체가 현재 값으로 유지됩니다. – InD
함수에서 시퀀스를 증가시킬 수 없으므로 저장 프로 시저에 있어야합니다.일단 시퀀스가 생성되면 시퀀스의 시작 값을 설정할 수 없다는 점에 유의하십시오. 현재 값을 얻거나 다음 순서 값으로 시작할 수 있습니다. 어느 쪽이 필요합니까? – h0ffm4nn