-2

我有 SQL Server 表tbl_Slide_master。它有一slide_position列为int. 但是,当管理员想要添加新幻灯片时,该列从该列的现有最大值增加 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;

发生了一个错误,例如

消息 1046,级别 15,状态 1,过程 sp_InsertNewSlide,第 21 行在
此上下文中不允许子查询。只允许标量表达式。

4

1 回答 1

2

在您的VALUES条款中,您有:

SELECT MAX(slide_position)+1

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

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

SELECT MAX(slide_position)+1 FROM tbl_Slide_master

但是,如果这只是一个普通的标识字段,则应IDENTITY (1,1)在表创建脚本中将其声明为字段,并简单地让 SQL Server 管理它。

于 2013-04-06T08:50:09.247 回答