从序列sql

时间:2016-04-18 09:26:56

标签: sql sql-server sql-server-2008

我正试图从此提交的SU - 1 /2016

中获取下一个值

我使用的查询

SELECT RIGHT('000' + CAST(ISNULL(MAX(SUBSTRING(InvoiceNO,4, 1)), 0) + 1 AS VARCHAR(4)), 4)
from [dbo].[Invoice]

查询输出为0001,应为0002

4 个答案:

答案 0 :(得分:3)

您从第4个位置将此值SELECT RIGHT('000' + CAST(ISNULL(MAX(SUBSTRING(InvoiceNO,6, 1)), 0) + 1 AS VARCHAR(4)), 4) from [dbo].[Invoice] 子字符串,这会给您“ - ”。因此,要获得1,您需要从第6个位置开始,这将为您提供预期的输出。

   PROGRAM RANDOM_POSITION
   IMPLICIT NONE
   REAL percent, val
   INTEGER maxi, mini, num, i, l
   INTEGER, DIMENSION(1), ALLOCATABLE :: position(:)
   PRINT *,'Range for the impurity position(maximum and minimum value):'
   PRINT *,'Minimum value:'
   READ (UNIT=*, FMT=*) mini
   PRINT *,'Maximum value:'
   READ (UNIT=*, FMT=*) maxi
   PRINT 11,'Percentage of impurity='
   11 FORMAT(A23,$)
   READ (UNIT=*, FMT=*) percent
   num = (maxi-mini) * percent
   IF ((maxi-mini) * percent-num  .NE. 0.0) THEN
      num = num + 1
   END IF
   PRINT *, num
   ALLOCATE (position(num))
   CALL RANDOM_SEED()
   DO i=1, num ,1
      CALL RANDOM_NUMBER(val)
      position(i) = NINT(mini + val * num)
      CALL JUDGEMENT(position, i, l)
      l = 0
      DO WHILE (l .EQ. 0)
               CALL RANDOM_NUMBER(val)
               position(i) = NINT(mini + val * num)
               CALL JUDGEMENT(position, i, l)
      END DO      
      PRINT *, position(i)
   END DO
   DEALLOCATE(position)
   STOP
   END PROGRAM RANDOM_POSITION
   SUBROUTINE JUDGEMENT(arr, j, l)
   IMPLICIT NONE
   INTEGER j, k, l
   INTEGER, DIMENSION(1) :: arr(j)
   l = 1
   DO k=1, j-1, 1
      IF (arr(k) .EQ. arr(j)) THEN
         l = 0
         EXIT
      ELSE
         l = 1
      END IF
   END DO
   RETURN
   END SUBROUTINE JUDGEMENT

答案 1 :(得分:1)

使用此代码。

SELECT RIGHT('000' + CAST((ISNULL(MAX(SUBSTRING(exampleColumn,6, 1)), 0) + 1) AS VARCHAR(4)), 4)
from [dbo].tblExample

你从第4位拿到了一个字符,但你的数据“1”位于第6位。

答案 2 :(得分:1)

如果我找到你,你正在使用substring上的SU - 1 /2016功能。从第4个位置获取长度为1的子字符串(记住substring是1,而不是0)。所以你得到-。如果您尝试:

SELECT '-' + 1

给予:1。 您可能需要在第6位开始“子串”。

答案 3 :(得分:1)

您可以缩短脚本并使用它:

SELECT RIGHT(MAX(SUBSTRING(InvoiceNO,6, 1)) + 10001, 4)
-- Including this for test:
FROM (values('SU - 1 /2016')) x(InvoiceNO)