如何在SQL Server 2005中设置增量列

时间:2013-04-06 08:42:12

标签: sql sql-server tsql

我有SQL Server表tbl_Slide_master。它有一列slide_positionint。但是,当管理员想要添加新幻灯片时,此列会从该列的现有最大值增加1。我还想更新这个字段。

有关详细信息,我提供了此代码。

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_InsertNewSlide]
(
    @Header_text varchar(25),
    @ImageName varchar(50),
    @Img_height int,
    @Img_width int,
    @Para_text varchar(520),
    @NewId INT OUTPUT
)
AS
BEGIN TRAN;
    BEGIN TRY
        INSERT INTO [OmStocks].[dbo].[tbl_Slide_master]
           ([Header_text]
           ,[ImageName]
           ,[Img_height]
           ,[Img_width]
           ,[Para_text]
           ,[slide_position]
            )
          VALUES
           (@Header_text,@ImageName,@Img_height,@Img_width,@Para_text,SELECT MAX(slide_position)+1)
        SET @NewId= SCOPE_IDENTITY()
    COMMIT TRAN;
    END TRY 

    BEGIN CATCH
    ROLLBACK TRAN;
        DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int;
        SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY();
        RAISERROR(@ErrMsg, @ErrSeverity, 1);
  END CATCH;

发生了一个错误,例如

  

Msg 1046,Level 15,State 1,Procedure sp_InsertNewSlide,Line 21
  在此上下文中不允许子查询。只有标量表达式   是允许的。

1 个答案:

答案 0 :(得分:2)

在您的VALUES条款中:

SELECT MAX(slide_position)+1

这不是有效的子查询,因为它不包含查询中的表名。

这个递增字段的逻辑对我来说并不清楚,所以我假设您只想要表中当前的最大值:

SELECT MAX(slide_position)+1 FROM tbl_Slide_master

但是,如果这只是一个普通的标识字段,您应该在表创建脚本中将其声明为IDENTITY (1,1)字段,只需让SQL Server对其进行管理即可。