2016-10-03 48 views
0

表tblidset在第一次运行时不包含任何内容,那么当我在代码中第一次调用此存储过程时,它应该从表中获取最高值,以便构建值随着程序数据的增长而变化。错误的问题是它在第一次运行时总是返回0。现在困住了几个小时。关心帮助?这是我的脚本:我的存储过程总是返回0

CREATE PROCEDURE CREATENEWID 
@TYPE AS INT 
AS 
BEGIN 

DECLARE @CNT AS INT; 
DECLARE @DOCNO AS BIGINT; 
DECLARE @DOCID AS BIGINT; 
SELECT @CNT = ISNULL(COUNT(*),0) FROM TBLIDSET 

--CHECK IF THERE IS NO VALUE AS OF DATE AND INSERT DEFAULT VALUES 
    IF @CNT = 0 

    BEGIN 

     INSERT INTO TBLIDSET SELECT TOP 1(DOCID),0 FROM INVHDR ORDER BY DOCID DESC 
    END 
    DECLARE @NUM AS INT; 
    IF @TYPE = 1 
     BEGIN 
      UPDATE TBLIDSET SET DOCID = DOCID +1 
      SELECT @NUM = DOCID FROM TBLIDSET 
     END 
    ELSE 
     BEGIN 
      UPDATE TBLIDSET SET DOCNO = DOCNO + 1 
      SELECT @NUM = DOCNO FROM TBLIDSET 
    END 
    PRINT @NUM 
    RETURN @NUM 

END 
GO 
+1

你为Type参数传递了什么? – Steve

+0

使用'MAX + 1'作为ID是一个*问题*,因为它很容易导致重复的值。此外,此代码不会查找*最大* ID,它只会返回一个随机数。 'SELECT @NUM = DOCID FROM TBLIDSET'可返回任何*的底层值 –

+0

而不是尝试生成自己的序列,请使用SQL Server的[SEQUENCE](https://msdn.microsoft.com/en-us/library /ff878058.aspx)功能,自SQL Server 2012起可用。您使用的是哪个版本? –

回答

0

请试试这段代码。我将输出参数添加到您的代码中。

CREATE PROCEDURE CREATENEWID 
@TYPE AS INT, 
@NUM AS INT OUT --Declare ouput parameter here 
AS 
BEGIN 

DECLARE @CNT AS INT; 
DECLARE @DOCNO AS BIGINT; 
DECLARE @DOCID AS BIGINT; 
SELECT @CNT = ISNULL(COUNT(*),0) FROM TBLIDSET 

--CHECK IF THERE IS NO VALUE AS OF DATE AND INSERT DEFAULT VALUES 
    IF @CNT = 0 

    BEGIN 

     INSERT INTO TBLIDSET SELECT TOP 1(DOCID),0 FROM INVHDR ORDER BY DOCID DESC 
    END 
    --Move your @NUM to output parameter 
    IF @TYPE = 1 
     BEGIN 
      UPDATE TBLIDSET SET DOCID = DOCID +1 
      SELECT @NUM = DOCID FROM TBLIDSET 
     END 
    ELSE 
     BEGIN 
      UPDATE TBLIDSET SET DOCNO = DOCNO + 1 
      SELECT @NUM = DOCNO FROM TBLIDSET 
    END 
    PRINT @NUM 
    RETURN @NUM 

END 
GO 
+0

为什么这会有所作为? 'RETURN'没有损坏。如果'@ NUM'有一个值'RETURN'将返回它。 –

+0

我认为他的第一次运行结果是执行结果代码。 0就是成功。我想通过OUT参数来帮助他。 –