Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Begin - End в процедуре (вопрос)  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Добрый день, коллеги!

Вопрос скорее всего ламерский, но всё же очень интересно знать.
Установил себе SQLCodeGuard. Просканировал базу.
Заинтересовали замечания:
1. SET NOCOUNT ON BEFORE DML
Не указана инструкция NOCOUNT в процедуре. Насколько это критично, как это может повлиять на её работу?
2. ST003 Procedure body not enclosed with BEGIN...END
Насколько критично отсутствие блока BEGIN - END в процедуре? Чем чревато?

Буду благодарен любым ответам или ссылкам налитературу (рус., англ., нем.).

Спасибо:)
24 июл 13, 17:43    [14612543]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Сергей Викт.
1. SET NOCOUNT ON BEFORE DML
Не указана инструкция NOCOUNT в процедуре. Насколько это критично, как это может повлиять на её работу?

На работу процедуры - никак. А на клиентское приложение - может. Особенно на плохо написанное
24 июл 13, 17:45    [14612555]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Glory
Сергей Викт.
1. SET NOCOUNT ON BEFORE DML
Не указана инструкция NOCOUNT в процедуре. Насколько это критично, как это может повлиять на её работу?

На работу процедуры - никак. А на клиентское приложение - может. Особенно на плохо написанное

Вы имеете ввиду, что после каждой выполненной инструкции сервер будет посылать клиенту количество обработанных записей, что увеличит сетевой трафик?
24 июл 13, 17:48    [14612569]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Сергей Викт.
Вы имеете ввиду, что после каждой выполненной инструкции сервер будет посылать клиенту количество обработанных записей, что увеличит сетевой трафик?

Не только
Некоторые программисты не учитывают в своем коде, что такие процедуры могут возвращать подобные результаты. И соответственно не обрабатывают их и получают исключение
24 июл 13, 17:52    [14612593]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Glory
Сергей Викт.
Вы имеете ввиду, что после каждой выполненной инструкции сервер будет посылать клиенту количество обработанных записей, что увеличит сетевой трафик?

Не только
Некоторые программисты не учитывают в своем коде, что такие процедуры могут возвращать подобные результаты. И соответственно не обрабатывают их и получают исключение

Понял. С этим вопросом ясно.
А по поводу BEGIN - END в процедуре вы могли бы что-нибудь подсказать? Лично я всегда "обрамляю" процедуру в блок BEGIN END, но сталкиваюсь с тем, что ранее написанные процедуры не имеют этого блока. Может быть есть какие-либо рекомендации на этот счет?
24 июл 13, 17:53    [14612602]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
Сергей Викт.
Лично я всегда "обрамляю" процедуру в блок BEGIN END, но сталкиваюсь с тем, что ранее написанные процедуры не имеют этого блока. Может быть есть какие-либо рекомендации на этот счет?
Не слышал о таких рекомендациях.
Сам никогда не пишу BEGIN END
24 июл 13, 17:57    [14612623]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
alexeyvg
Сергей Викт.
Лично я всегда "обрамляю" процедуру в блок BEGIN END, но сталкиваюсь с тем, что ранее написанные процедуры не имеют этого блока. Может быть есть какие-либо рекомендации на этот счет?
Не слышал о таких рекомендациях.
Сам никогда не пишу BEGIN END

Это результат сканирования базы плагином sqlcodeguard (здесь где-то был), поэтому заинтересовал данный вопрос. Логика какая: не просто же так он выдаёт подобные сообщения?:)

p.S. Хотя, конечно, это может быть просто предупреждением для программиста, не несущим серьезной смысловой нагрузки
24 июл 13, 17:59    [14612636]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Может быть есть какие-либо рекомендации на этот счет?

Есть.
BOL -> CREATE PROCEDURE
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
...
AS { <sql_statement> [;][ ...n ] | <method_specifier> }
[;]
...

<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }]

Что недвусмысленно намекает, что слова BEGIN/END являются опциональными.
24 июл 13, 18:00    [14612642]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей Викт.
Это результат сканирования базы плагином sqlcodeguard. Логика какая: не просто же так он выдаёт подобные сообщения?:)

Об этом, наверное, лучше узнать у производителя sqlcodeguard
24 июл 13, 18:01    [14612650]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Сергей Викт.
А по поводу BEGIN - END в процедуре вы могли бы что-нибудь подсказать? Лично я всегда "обрамляю" процедуру в блок BEGIN END, но сталкиваюсь с тем, что ранее написанные процедуры не имеют этого блока. Может быть есть какие-либо рекомендации на этот счет?


Обрамляющий блок BEGIN ... END указан в синтаксисе, как необязательный:

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] 
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ ...n ] | <method_specifier> }
[;]
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE AS Clause ]

<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }

А рекомендации SQLCodeGuard - это из области хорошего тона в написании кода.
24 июл 13, 18:03    [14612654]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гость333
Сергей Викт.
Может быть есть какие-либо рекомендации на этот счет?

Есть.
BOL -> CREATE PROCEDURE
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
...
AS { <sql_statement> [;][ ...n ] | <method_specifier> }
[;]
...

<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }]

Что недвусмысленно намекает, что слова BEGIN/END являются опциональными.

это понятно, я с технической точки зрения, возможны ли какие-то "подводные камни". Но, судя по всему нет)
В любом случае всем спасибо, теперь я спокоен про BEGIN END, а с NOCOUNT буду общаться с программистами клиентской части.
24 июл 13, 18:03    [14612655]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
pkarklin
А рекомендации SQLCodeGuard - это из области хорошего тона в написании кода.

Спасибо:) Вот собственно то, что даёт ответ на мой вопрос:)
24 июл 13, 18:04    [14612660]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Сергей Викт.
Это результат сканирования базы плагином sqlcodeguard (здесь где-то был), поэтому заинтересовал данный вопрос. Логика какая: не просто же так он выдаёт подобные сообщения?:)


Залезьте в настройки и увидите, к какой группе относится этот пункт - Best Practice.
24 июл 13, 18:05    [14612663]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
У нас, к примеру, типичная процедура выглядит так:
CREATE PROCEDURE dbo.Процедура
   @Параметры
AS
BEGIN TRY
   Действия;
END TRY
BEGIN CATCH
   Логирование ошибки;
   RAISERROR(Переброс ошибки на верхний уровень);
END CATCH;
GO

Ради каких best practices обрамлять это ещё и в BEGIN/END, непонятно.
24 июл 13, 18:18    [14612717]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Гость333
У нас, к примеру, типичная процедура выглядит так:
CREATE PROCEDURE dbo.Процедура
   @Параметры
AS
BEGIN TRY
   Действия;
END TRY
BEGIN CATCH
   Логирование ошибки;
   RAISERROR(Переброс ошибки на верхний уровень);
END CATCH;
GO

Ради каких best practices обрамлять это ещё и в BEGIN/END, непонятно.

Ваш вариант мне тоже кажется из best practices, может предложить автору SQLCodeQuard такой вариант обрамления?
24 июл 13, 18:33    [14612784]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
Glory
Сергей Викт.
1. SET NOCOUNT ON BEFORE DML
Не указана инструкция NOCOUNT в процедуре. Насколько это критично, как это может повлиять на её работу?

На работу процедуры - никак. А на клиентское приложение - может. Особенно на плохо написанное


На самом деле работа процедуры иногда сильно связана с работой клиента.
Зависнет клиент, не сможет получать данные с сервера -- зависнет вскоре и серверная процедура.
25 июл 13, 01:17    [14614113]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Сергей Викт.
2. ST003 Procedure body not enclosed with BEGIN...END
Насколько критично отсутствие блока BEGIN - END в процедуре? Чем чревато?


STxxx - style issues
процедура без явных операторных скобок - неаккуратненько. Не критично, ни на что не влияет,но некрасивенько.

Хотя обраляющие скобки и необязательны - так и семиколон не обязателен. за исключением пары-тройки мест.
А все примеры в новых болах - с семиколонами.
Хотя вот примеры на create proc - без внешних скобок :(

зы давно уже просили дать strict syntax mode - не дают, негодяи. а мы мучайся.
25 июл 13, 02:08    [14614148]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Minamoto
Гость333
У нас, к примеру, типичная процедура выглядит так:
CREATE PROCEDURE dbo.Процедура
   @Параметры
AS
BEGIN TRY
   Действия;
END TRY
BEGIN CATCH
   Логирование ошибки;
   RAISERROR(Переброс ошибки на верхний уровень);
END CATCH;
GO

Ради каких best practices обрамлять это ещё и в BEGIN/END, непонятно.

Ваш вариант мне тоже кажется из best practices, может предложить автору SQLCodeQuard такой вариант обрамления?

Можно. Но когда будет - пока неизвестно.
25 июл 13, 02:10    [14614150]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
locky
Сергей Викт.
2. ST003 Procedure body not enclosed with BEGIN...END
Насколько критично отсутствие блока BEGIN - END в процедуре? Чем чревато?


STxxx - style issues
процедура без явных операторных скобок - неаккуратненько. Не критично, ни на что не влияет,но некрасивенько.

Хотя обраляющие скобки и необязательны - так и семиколон не обязателен. за исключением пары-тройки мест.
А все примеры в новых болах - с семиколонами.
Хотя вот примеры на create proc - без внешних скобок :(

зы давно уже просили дать strict syntax mode - не дают, негодяи. а мы мучайся.

Спасибо, locky. Залез в настройки, всё стало гораздо понятнее)))
25 июл 13, 08:43    [14614375]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
32 раза
Guest
Сергей Викт.,

навеяно вот этой темой:
https://www.sql.ru/forum/1035382/hranimaya-procedura-vypolnyaetsya-neskolko-raz?hl=32

т.е. например, могло бы тут помочь,
в смысле, закончилась процедура, вот официальный END,
навряд ли автор "рекурсии" впихнул бы вызов процедуры до END
25 июл 13, 14:07    [14616233]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
32 раза
Сергей Викт.,

навеяно вот этой темой:
https://www.sql.ru/forum/1035382/hranimaya-procedura-vypolnyaetsya-neskolko-raz?hl=32

т.е. например, могло бы тут помочь,
в смысле, закончилась процедура, вот официальный END,
навряд ли автор "рекурсии" впихнул бы вызов процедуры до END
END - не конец процедуры!
Так что не помогло бы
25 июл 13, 14:15    [14616290]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
Раз уж затронули тему процедур, хотелось бы узнать мнение по поводу такого высказывания:
http://www.intuit.ru/studies/courses/68/68/lecture/1039
автор
Вы не должны использовать префикс sp_ при создании простых определяемых пользователем хранимых процедур. Если SQL Server обнаруживает хранимую процедуру, имеющую префикс sp_, то он сначала ищет эту хранимую процедуру в главной базе данных (master). И если вы создадите, например, хранимую процедуру с именем sp_myproc в базе данных MyDB, то SQL Server сначала будет искать эту процедуру в главной базе данных, а уж затем в пользовательских базах данных. Разумнее назвать процедуру просто myproc.


Кто-нибудь тестировал, насколько это критично, и как падает скорость выполнения процедуры с префиксом "sp_" и без него?
25 июл 13, 14:17    [14616299]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
ROLpogo
Раз уж затронули тему процедур, хотелось бы узнать мнение по поводу такого высказывания:
http://www.intuit.ru/studies/courses/68/68/lecture/1039
автор
Вы не должны использовать префикс sp_ при создании простых определяемых пользователем хранимых процедур. Если SQL Server обнаруживает хранимую процедуру, имеющую префикс sp_, то он сначала ищет эту хранимую процедуру в главной базе данных (master). И если вы создадите, например, хранимую процедуру с именем sp_myproc в базе данных MyDB, то SQL Server сначала будет искать эту процедуру в главной базе данных, а уж затем в пользовательских базах данных. Разумнее назвать процедуру просто myproc.


Кто-нибудь тестировал, насколько это критично, и как падает скорость выполнения процедуры с префиксом "sp_" и без него?


когда-то падал значительно
сейчас - не так заметно, но подводные камни и кроме падения производительности остались
так что лучше не использовать sp_
25 июл 13, 14:18    [14616310]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
32 раза
Guest
iap,

ой!
и правда не конец, и правда, не помогло
25 июл 13, 14:20    [14616331]     Ответить | Цитировать Сообщить модератору
 Re: Begin - End в процедуре (вопрос)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
32 раза
iap,

ой!
и правда не конец, и правда, не помогло


а вот был бы синтаксис строже - помогло бы
25 июл 13, 14:22    [14616346]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить