如果不可用,如何设置列值

时间:2013-05-21 04:19:45

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

我有一张表如下。 表名:TESTNUMBERS

ID(INT)   NUMBER(INT)    NAME(NVARCHAR(50))
1         1             Test
2         1             Test
3         2             Test2

当我插入NUMBER列时,我需要增加,如果不可用,如果可用,那么最大id值+ 1,并确保数字是否作为参数传递,然后保存原样。(这是为了确保约束NAME为相同的行也会有相同的NUMBER列。

我写了一篇SP但有一些语法问题。

CREATE PROCEDURE TEST_STOREDPROC
@Name           NVARCHAR(50),
@Number         INT = 0,
@ID INT      
AS
BEGIN
  SET NOCOUNT ON
BEGIN TRY
        DECLARE @IncrementID SMALLINT; SET @IncrementID=1;   
        DECLARE @IncrementNumber INT; SET @IncrementNumber = 1;
        BEGIN TRAN
        BEGIN
        IF @Number = 0
        BEGIN            
         SET @Number =
         SELECT  ISNULL(MAX(Number),0)+@IncrementNumber
         from TESTNUMBERS
        END

            INSERT INTO TESTNUMBERS
                       ([ID]
                       ,[Name]
                       ,[Number])

            SELECT  ISNULL(MAX([ID]),0)+@IncrementID as [ID]                                            
                                               ,@Name
                                               ,@Number                                 
            FROM   TESTNUMBERS  
            --return the ID of the column inserted
            SELECT MAX([ID]) from TESTNUMBERS  
        END
        COMMIT TRAN
 END TRY
BEGIN CATCH
--TO DO      
END CATCH
END    
GO         

如何改进和纠正此SP?

2 个答案:

答案 0 :(得分:0)

        CREATE PROCEDURE SP_TEST
        @Name           NVARCHAR(50),
        @Number         INT = 0,
        @ID INT      
        AS
        BEGIN
          SET NOCOUNT ON
        BEGIN TRY
                DECLARE @IncrementID SMALLINT; SET @IncrementID=1;   
                DECLARE @IncrementNumber INT; SET @IncrementNumber = 1;
                BEGIN TRAN
                BEGIN
                IF @Number = 0
                *BEGIN            
                 **SET @Number =(SELECT  ISNULL(MAX(Number),0)+@IncrementNumber from TESTNUMBERS)***
                END

                    INSERT INTO TESTNUMBERS
                               ([ID]
                               ,[Name]
                               ,[Number])

                    SELECT  ISNULL(MAX([ID]),0)+@IncrementID as [ID]                                            
                                                       ,@Name
                                                       ,@Number                                 
                    FROM   TESTNUMBERS  
                    --return the ID of the column inserted
                    SELECT MAX([ID]) from TESTNUMBERS  
                END
                COMMIT TRAN
         END try
         **BEGIN CATCH
          ROLLBACK TRAN
        END CATCH**  
         end

您的存储过程中存在两个语法错误

  1. 当您通过sql select query为任何变量赋值时,您必须添加圆括号。

  2. 我想你在尝试阻止之后忘记了阻塞阻塞,这是必要的其他谁将捕获你的异常并在错误后进行必要的事务:),另外你的程序有良好的逻辑,继续保持。对于语法谷歌有... ....

答案 1 :(得分:0)

试试这个 -

CREATE PROCEDURE dbo.usd_TEST_STOREDPROC

      @Name NVARCHAR(50)
    , @Number INT = 0
    , @ID INT   

AS BEGIN

    SET NOCOUNT ON;

    BEGIN TRY

        DECLARE 
              @IncrementID SMALLINT = 1 
            , @IncrementNumber INT = 1 

        BEGIN TRAN BEGIN

            SELECT @Number = ISNULL(MAX(Number), 0) + @IncrementNumber
            FROM dbo.TESTNUMBERS
            WHERE @Number = 0

            INSERT INTO dbo.TESTNUMBERS([ID], [Name], [Number])
            SELECT 
                  ISNULL(MAX([ID]), 0) + @IncrementID                                            
                , @Name
                , @Number                                 
            FROM dbo.TESTNUMBERS

            SELECT MAX([ID]) 
            FROM dbo.TESTNUMBERS

        END

        COMMIT TRAN

    END TRY

    BEGIN CATCH
    END CATCH

END