Member 8583441 Ответов: 2

Несколько запросов в хранимой процедуре SQL server не выполняются


Я создал хранимую процедуру,в которой есть запросы select,insert, delete, а также update. В котором выполняется только один запрос в хранимой процедуре, остальные не выполняются.

Что я уже пробовал:

хранимая процедура:
CREATE PROCEDURE [dbo].[usp_Emp_LeaveApplication]
(
	@EmpID				VARCHAR(50),
	@NumberOfDays		INT,
	@LeaveFromDate		DATE,
	@LeaveToDate		DATE,
	@CreatedOn			DATETIME,
	@TypeOfLeave		VARCHAR(100),
	@StatusOfLeave		VARCHAR(10),
	@ReasonForLeave		VARCHAR(MAX),
	@Comments			VARCHAR(MAX),
	@StatementType		NVARCHAR(20) = '',
    @ResponseMessage	NVARCHAR(250) OUTPUT
)

AS  
BEGIN

	SET NOCOUNT ON;

	SET @LeaveFromDate = CONVERT(datetime, @LeaveFromDate)
	SET @LeaveToDate = CONVERT(datetime, @LeaveToDate)
	SET @Comments = ISNULL(NULL, @Comments)

	BEGIN TRY
		BEGIN TRANSACTION
			IF (@StatementType = 'Insert')
			BEGIN
				INSERT INTO Emp_LeaveApplication ( EmpID, NumberOfDays, LeaveFromDate, LeaveToDate, CreatedOn, TypeOfLeave, StatusOfLeave, ReasonForLeave, Comments) 
				values( @EmpID, @NumberOfDays, @LeaveFromDate, @LeaveToDate, @CreatedOn, @TypeOfLeave, @StatusOfLeave, @ReasonForLeave, @Comments)

				SET @ResponseMessage = 'Your request for leave has registered successfully!!!'
			END
			ELSE IF (@StatementType = 'Select')
			BEGIN
				select * from Emp_LeaveApplication
			END
			ELSE IF (@StatementType = 'SelectByID')
			BEGIN
				SELECT * FROM Emp_LeaveApplication WHERE EmpID = @EmpID
			END
			ELSE IF (@StatementType = 'Update')
			BEGIN
				UPDATE Emp_LeaveApplication SET
				NumberOfDays = @NumberOfDays, LeaveFromDate = @LeaveFromDate, LeaveToDate = @LeaveToDate, TypeOfLeave= @TypeOfLeave, StatusOfLeave = @StatusOfLeave, ReasonForLeave = @ReasonForLeave WHERE EmpID = @EmpID

				SET @ResponseMessage = 'Your leave status has been updated successfully!!!'
			END  
			ELSE IF (@StatementType = 'Delete')
			BEGIN
				DELETE FROM Emp_LeaveApplication WHERE EmpID = @EmpID

				SET @ResponseMessage = 'Leave request has been deleted'
			END
			ELSE IF (@StatementType = 'Cancel')
			BEGIN
				UPDATE Emp_LeaveApplication SET
				StatusOfLeave = 'Cancelled', ReasonForLeave = @ReasonForLeave WHERE EmpID = @EmpID

				SET @ResponseMessage = 'Your leave status has been cancelled successfully!!!'
			END
		COMMIT TRANSACTION
	END TRY
	BEGIN CATCH
		IF @@TRANCOUNT > 0
			BEGIN
				SET @ResponseMessage = ERROR_MESSAGE()
				ROLLBACK TRANSACTION
			END
	END CATCH
END


Что я делаю неправильно. Кто-нибудь может мне объяснить

Member 8583441

Я не с помощью любого элемента управления GridView, только кнопка событие click

OriginalGriff

Какой из них, и что вы выдаете за других?
И вообще, зачем тебе это делать?

Member 8583441

Мне нужно внести некоторые изменения в таблицы базы данных с определенным столбцом..... Если это неправильное предложение, предложите мне лучшее, чтобы практиковать для себя, сэр.

2 Ответов

Рейтинг:
20

#realJSOP

Ваш текущий подход-это ложная оптимизация и головная боль обслуживания. Вы действительно можете вставить/обновить один сохраненный proc, и даже без передачи параметра, чтобы вытащить его. Это будет выглядеть примерно так:

create procedure sp_UpsertData
(
    @field1 type
    @field2 type
    @field3 type
    @field4 type
    @field5 type
)
as begin
    -- update the appropriate record
    UPDATE [mytable] 
    SET field1=@field1
        field2=@field2
        field3=@field3
    WHERE field4 = @field4 and field5 = @field5
    -- if no records were affected
    IF @@ROWCOUNT = 0
    begin
        -- insert the data
        INSERT INTO [mytable] (field1, field2, field3, field4, field5)
        VALUES (@field1, @field2, @field3, @field4, @field5)
    end
end


Что касается операций удаления или выбора,то вы можете сгруппировать выбранные вещи без особого отталкивания от баз данных, но действие удаления действительно должно быть в своем собственном хранимом процессе.

Кроме того, посмотрите на параметры по умолчанию, где параметр установлен в значение по умолчанию, и используйте его в качестве указания на то, какой тип select выполнять.


Member 8583441

это означает, что мы должны использовать запросы insert и update в одной хранимой процедуре, а запрос delete должен быть в другой хранимой процедуре, сэр.

Member 8583441

Могу ли я также выбрать и удалить запрос, следует ли взять другой или мы должны включить его в хранимую процедуру insert, сэр.

#realJSOP

Поставить вставки/обновления в одной хранимой процедуре, выберите в другое, и удалить еще один.

Maciej Los

5ed!

Praveen_P

++5 !

Рейтинг:
1

OriginalGriff

Цитата:
Мне нужно внести некоторые изменения в таблицы базы данных с определенным столбцом..... Если это неправильное предложение, предложите мне лучшее, чтобы практиковать для себя, сэр.
Вся идея "делай все"СР неверна: это просто очень плохая идея.
Вы должны называть его по-разному в зависимости от того, что вы делаете: вставка или обновление будут использовать ExecuteNonQuery или ExecuteScalar, в то время как SELECT нуждается в DataAdapter, DataReader или ExecuteScalar.
А построение транзакции вокруг SELECT? Какая польза от этого, если SELECT не может повлиять на значения базы данных?
Даже если ваш запрос не был выбран, транзакция в значительной степени бесполезна, так как вы пытаетесь повлиять только на одну строку за раз, и если это не удастся, система все равно ничего не изменит!

Честно говоря, я бы не стал помещать все это в SP - там нет ничего, что не было бы более ясным, если бы обрабатывалось непосредственно на языке презентации.


#realJSOP

Лично я предпочитаю использовать хранимые процессы, а не помещать весь этот sql в код приложения. У меня даже есть способ документировать хранимые процессы на стороне C#, так что вы знаете, что это за параметры с помощью intellisense. Конечно, это делает немного больше работы, но в конце концов это того стоит (для меня).

Member 8583441

Спасибо вам всем за ваши предложения. В принципе, у меня есть 1 год опыта, поэтому я не знаю, как писать код. Я учусь человек в кодировании

OriginalGriff

Всегда пожалуйста!