Путаница с оператором GO, незафиксированными транзакциями и процедурой изменения - PullRequest
2 голосов
/ 10 июня 2011

Я бы хотел разобраться с этим, потому что это меня смущает. Может кто-нибудь объяснить, когда я должен использовать оператор GO в моих сценариях?

Насколько я понимаю, оператор GO не является частью языка T-SQL, вместо этого он используется для отправки пакета операторов на SQL-сервер для обработки.

Когда я запускаю следующий скрипт в Query Analyzer, он работает нормально. Затем я закрываю окно, и оно отображает предупреждение:

«Есть незафиксированные транзакции. Вы хотите зафиксировать эти транзакции перед закрытием окна?»

BEGIN TRANSACTION;
GO 

ALTER PROCEDURE [dbo].[pvd_sp_job_xxx]
    @jobNum varchar(255)

AS
BEGIN

    SET NOCOUNT ON;
    UPDATE tbl_ho_job SET delete='Y' WHERE job = @job;
END


COMMIT TRANSACTION;
GO

Однако, если я добавлю GO в конце инструкции ALTER, все будет в порядке (как показано ниже). Как так?

BEGIN TRANSACTION;
GO



ALTER PROCEDURE [dbo].[pvd_sp_xxx]
    @jobNum varchar(255)

AS
BEGIN

    SET NOCOUNT ON;
    UPDATE tbl_ho_job SET delete='Y' WHERE job = @job;
END
GO


COMMIT TRANSACTION;
GO

Я думал об удалении всех GO, но потом жалуется, что оператор процедуры alter должен быть первым оператором внутри пакета запроса? Это просто требование, которого я должен придерживаться?

Это кажется странным, потому что, если я НАЧИНАЮ ТРАНЗАКЦИЮ и ИДЕМ .... этот оператор отправляется на сервер для обработки, и я начинаю транзакцию.

Далее следуют процедура ALTER, COMMIT TRANSACTION и GO (таким образом, отправляя эти операторы на сервер для обработки с коммитом для завершения транзакции, начатой ​​ранее), почему он жалуется, когда я все еще закрываю окно? Конечно, я убедился, что оператор alter-процедуры является первым в пакете. Почему он жалуется на незафиксированные транзакции?

Любая помощь будет наиболее ценится!

Ответы [ 2 ]

5 голосов
/ 10 июня 2011

В вашем первом скрипте COMMIT является частью хранимой процедуры ...

BEGIN и END в хранимой процедуре не определяют область (начало + конец тела хранимой процедуры): пакет выполняет следующее GO (или конец скрипта)

Итак, изменив интервал и добавив комментарии

BEGIN TRANSACTION;
GO 
--start of batch. This comment is part of the stored proc too
ALTER PROCEDURE [dbo].[pvd_sp_job_xxx]
    @jobNum varchar(255)
AS
BEGIN --not needed
    SET NOCOUNT ON;
    UPDATE tbl_ho_job SET delete='Y' WHERE job = @job;
END --not needed
--still in the stored proc
COMMIT TRANSACTION;
GO--end of batch and stored procedure

Чтобы проверить, запустите

SELECT OBJECT_DEFINITION(OBJECT_ID('dbo.pvd_sp_job_xxx'))
0 голосов
/ 14 июня 2013

Несмотря на то, что это старый пост, вопрос все еще остается в моей голове после того, как я успешно скомпилировал одну из моих процедур без какой-либо начальной транзакции, фиксации транзакции или перехода. И процедура может быть вызвана и дать ожидаемый результат. Я работаю с SQL Server 2012. Вносит ли он какие-либо изменения

Я знаю, что это для ответа. Но слова слишком малы, чтобы замечать их в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...