사용

2017-12-06 3 views
0

상황/목표 :사용

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에 대한 호출에 점점없이

답변

0

(솔루션은 마이크로 소프트 SQL 서버 2012 이상 사용 가능해야 함))이 코드는 실제로 시퀀스를 증가시키지 않고 범위의 값을 반환합니다 (이 방법은 설정 기반이 아니라 반복적 인 방법 임). 세트 - 기반 지금) :

CREATE FUNCTION dbo.GetSeqRange(@seqname VARCHAR(MAX), @start INT, @end INT) 
    RETURNS @ReturnTable TABLE (
     ReturnValue INT 
    ) 
AS 
BEGIN 
DECLARE @increment INT = (SELECT CONVERT(INT, increment) FROM sys.sequences WHERE [name] = @seqname) 
DECLARE @i INT = @start 
WHILE @i <= @end 
BEGIN 
    INSERT @ReturnTable VALUES(@i) 
    SET @i += @increment 
END 
    RETURN 
END 

순서를 증가 시키려면 블록의 내부를 SELECT NEXT VALUE FOR <seqname>으로 바꾸고이를 결과 테이블에 삽입하십시오. 도움이되는지 알려주세요! 또는 당신을 오해 한 경우 수정합니다.

+0

감사합니다.하지만 제 문제에 대한 부분적인 해결책 일뿐입니다. 제공 한 기능을 사용하면 시퀀스 자체가 현재 값으로 유지됩니다. – InD

+0

함수에서 시퀀스를 증가시킬 수 없으므로 저장 프로 시저에 있어야합니다.일단 시퀀스가 ​​생성되면 시퀀스의 시작 값을 설정할 수 없다는 점에 유의하십시오. 현재 값을 얻거나 다음 순서 값으로 시작할 수 있습니다. 어느 쪽이 필요합니까? – h0ffm4nn