2013-04-06 2 views
-2

У меня есть таблица SQL Server tbl_Slide_master. Он имеет одну колонку slide_position как int. Однако, когда администратор хочет добавить новый слайд, этот столбец увеличивается с 1 от существующего максимального значения этого столбца. и я просто хочу обновить это поле.Как установить столбец incrementer в SQL Server 2005

Для получения дополнительной информации я включил этот код.

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, процедура sp_InsertNewSlide, линия 21
подзапросы не допускаются в этом контексте. Разрешены только скалярные выражения .

+0

Вопрос очень неясен - вы спрашиваете, как иметь поле автоматического приращения на столе или о вашей ошибке получать? – Oded

+4

Для столбца автоинкрементции используйте тип 'INT IDENTITY (1,1)' datatype - не сворачивайте свою собственную логику ... (и использование 'SELECT MAX() + 1' очень плохое и ** небезопасно ** под нагрузкой - вы получите дубликаты!) –

+2

Боковое примечание: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

ответ

2

В вашей статье VALUES у вас есть:

SELECT MAX(slide_position)+1 

Это не является допустимым подзапрос, поскольку он не включает имя таблицы в запросе.

Логика этого поля Инкрементирование не ясно для меня, так что я предполагаю, что вы просто хотите, наибольшее значение в настоящее время в таблице:

SELECT MAX(slide_position)+1 FROM tbl_Slide_master 

Однако, если это просто нормальное поле идентификатора, вы должен объявить его как поле IDENTITY (1,1) в сценарии создания таблицы и просто позволить SQL Server управлять им.

+0

Могу ли я обновить это поле IDENTITY из запроса Update. –

+0

что не решение, что я нашел его, я не использую это, как искривленный нет, я просто хочу обновить этот файл slide_position с помощью запроса на обновление. –

+1

@ShalinGajjar - Нет. Это управляется SQL Server. То, что вы делаете, подвержено проблемам под нагрузкой. – Oded

Смежные вопросы