我有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;
发生了一个错误,例如
Msg 1046,Level 15,State 1,Procedure sp_InsertNewSlide,Line 21
在此上下文中不允许子查询。只有标量表达式 是允许的。
答案 0 :(得分:2)
在您的VALUES
条款中:
SELECT MAX(slide_position)+1
这不是有效的子查询,因为它不包含查询中的表名。
这个递增字段的逻辑对我来说并不清楚,所以我假设您只想要表中当前的最大值:
SELECT MAX(slide_position)+1 FROM tbl_Slide_master
但是,如果这只是一个普通的标识字段,您应该在表创建脚本中将其声明为IDENTITY (1,1)
字段,只需让SQL Server对其进行管理即可。