Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
 SqlCodeGuard - бесплатный addin для SSMS  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Собственно, вот http://www.sqlcodeguard.com/
Поддерживает 2005/2008/2008R. Синтаксис 2012 тоже в значительной мере поддерживается, но в SSMS 2012 не интегрируется.
Производит статический анализ T-Sql кода на предмет всяких нескладушек (нечто вроде решарпера для T-Sql, только не онлайновый и не умеет вносить изменения, только показывает проблемны места).
Строит дерево зависимостей объектов (кто где используется и где производится insert/update/delete для таблицы/представления)
Вычисляет показатель сложности процедур/функций, как общий, так и средне-стейтментный.
Показывает outline с навигацией по коду и показателями сложности стейтментов/блоков.

-------------------------
There’s no silver bullet!
21 авг 12, 11:38    [13041868]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Рекомендую! Удобная тулза.
21 авг 12, 12:37    [13042382]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
Хороший инструмент.

Чего, ИМХО, на первый взгляд не хватает:
1. Issue templates
2. Скрипт объекта генерить как alter (если применимо), а не create. И включать в него use <БД>.

На что нарвался:
1. Для "Incompatible literal for procedure call" не учитываются UDT, если они основаны на системном типе.
21 авг 12, 12:52    [13042500]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
Считает, что здесь Asterix in select list. Я вот не уверен.
    declare cr cursor fast_forward 
    for
        with c as (
            select
                a.*
                , percent_used = cast ( a.[used, GB] / a.[total, GB] * 100.0 as decimal (38, 2) )
            from (
                select 
                      fg.name
                      , [used, GB] = cast ( (sum(au.total_pages * 1.) * 8 * 1024) / 1024 / 1024 / 1024 as decimal(38, 2) )
                      , [total, GB] = (
                        select
                            cast ( sum ( f.size*1.000 /128.000 ) / 1024 as decimal (38, 2) )
                        from sys.sysfiles    f   
                        where
                            f.groupid = fg.data_space_id      
                      )
                from        sys.filegroups          fg
                inner join  sys.allocation_units    au on fg.data_space_id = au.data_space_id 
                group by 
                      fg.data_space_id
                      , fg.name
            ) a
        )    
        select
            name
            , percent_used  = cast(percent_used as int)
        from c
        where
            c.percent_used > @percent_used_threshold
21 авг 12, 13:06    [13042639]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
[DEP26] Про то, что 3 and four part names in select list deprecated. Как бы нет их в select list.
    declare
        @backp_log_job_name         sysname = ( select x.name from msdb.dbo.sysjobs_view x where x.job_id = @backp_log_job_id )


З.Ы. И ниоткуда не скорпировать полное имя issue.
21 авг 12, 13:39    [13042920]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
Incorrect number of fetch variables. Declared 1, fetched 3.

    declare cr cursor local fast_forward 
    for
        select
            x.job_id
            , x.history_message
            , x.sql
        from    @jobs_created   x
        where
            x.result                = 1
            and x.history_message   is not null 
            
    open cr
    
    while 2*2 = 4 begin
        fetch next from cr into @job_id, @history_message, @sql


З.Ы. Похоже, есть проблемы, когда запятая на другой строке находится. Ругался на extra-параметры где-то.
21 авг 12, 13:43    [13042947]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
Честно наругался на проверку на клиентские транзакции. С одной стороны, да rollback без begin tran, с другой, как бы, и проверка на @@trancount присутствует.

    if @@trancount > 0 begin
        raiserror ('Procedure ... could not be run in transaction. Transaction is rolled back.', 16, 1)
        rollback
        goto the_end
    end
21 авг 12, 13:46    [13042968]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989


К сообщению приложен файл. Размер - 22Kb
21 авг 12, 14:07    [13043112]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
Гавриленко Сергей Алексеевич
Считает, что здесь Asterix in select list. Я вот не уверен.
    declare cr cursor fast_forward 
    for
        with c as (
            select
                a.*
                , percent_used = cast ( a.[used, GB] / a.[total, GB] * 100.0 as decimal (38, 2) )
            from (
                select 
                      fg.name
                      , [used, GB] = cast ( (sum(au.total_pages * 1.) * 8 * 1024) / 1024 / 1024 / 1024 as decimal(38, 2) )
                      , [total, GB] = (
                        select
                            cast ( sum ( f.size*1.000 /128.000 ) / 1024 as decimal (38, 2) )
                        from sys.sysfiles    f   
                        where
                            f.groupid = fg.data_space_id      
                      )
                from        sys.filegroups          fg
                inner join  sys.allocation_units    au on fg.data_space_id = au.data_space_id 
                group by 
                      fg.data_space_id
                      , fg.name
            ) a
        )    
        select
            name
            , percent_used  = cast(percent_used as int)
        from c
        where
            c.percent_used > @percent_used_threshold
В derived table то же самое.
21 авг 12, 14:11    [13043153]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Гавриленко Сергей Алексеевич
Честно наругался на проверку на клиентские транзакции. С одной стороны, да rollback без begin tran, с другой, как бы, и проверка на @@trancount присутствует.

    if @@trancount > 0 begin
        raiserror ('Procedure ... could not be run in transaction. Transaction is rolled back.', 16, 1)
        rollback
        goto the_end
    end


проблема не в самом по себе rollback, а в потенциальном сообщении об ошибке
автор
Msg 266, Level 16, State 2, Procedure _testproc, Line 0
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing.

очень бы хотелось иметь переключатель для этого, но ведь никто не даст, хотя и просили, если правильно помню
21 авг 12, 15:51    [13044106]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Konst_One
Member

Откуда:
Сообщений: 11522
кстати, тоже поддерживаю вопрос: что такое TBL005 (Index), в чём его суть?
21 авг 12, 15:53    [13044122]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Гавриленко Сергей Алексеевич
Incorrect number of fetch variables. Declared 1, fetched 3.

    declare cr cursor local fast_forward 
    for
        select
            x.job_id
            , x.history_message
            , x.sql
        from    @jobs_created   x
        where
            x.result                = 1
            and x.history_message   is not null 
            
    open cr
    
    while 2*2 = 4 begin
        fetch next from cr into @job_id, @history_message, @sql


З.Ы. Похоже, есть проблемы, когда запятая на другой строке находится. Ругался на extra-параметры где-то.


Скорее всего в коде повторно используется имя то же самое имя курсора.
extra-parameters (EI004 A named parameter is not found in parameter list of a procedure.) означает что при вызове процедуры был использован именованный стиль передачи параметров, но в дефиниции самой процедуры параметр с таким именем найден не был.
21 авг 12, 15:56    [13044142]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
locky
extra-parameters (EI004 A named parameter is not found in parameter list of a procedure.) означает что при вызове процедуры был использован именованный стиль передачи параметров, но в дефиниции самой процедуры параметр с таким именем найден не был.
С этим точно все нормально было. Буду копаться - покажу.
21 авг 12, 15:58    [13044163]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Konst_One
кстати, тоже поддерживаю вопрос: что такое TBL005 (Index), в чём его суть?

категория Table design issue является экспериментальной и наиболее сырой.
В частности, TBL005 (Index) означает что найдены избыточные индексы (например idx1(FirstName,LastName) и idx2(FirstName) - idx2 является потенциально избыточным, т.к. покрывается индексом idx1)
21 авг 12, 15:59    [13044175]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Гавриленко Сергей Алексеевич
locky
extra-parameters (EI004 A named parameter is not found in parameter list of a procedure.) означает что при вызове процедуры был использован именованный стиль передачи параметров, но в дефиниции самой процедуры параметр с таким именем найден не был.
С этим точно все нормально было. Буду копаться - покажу.

такое сообщение может появится также в случае, если не удалось проанализровать (в силу тех или иных причин) саму процедуру - и не удалось получить список её параметров.

ну и, разумеется, в случае банального бага
21 авг 12, 16:00    [13044185]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
invm
Хороший инструмент.

Чего, ИМХО, на первый взгляд не хватает:
1. Issue templates
2. Скрипт объекта генерить как alter (если применимо), а не create. И включать в него use <БД>.

На что нарвался:
1. Для "Incompatible literal for procedure call" не учитываются UDT, если они основаны на системном типе.


1. что такое "issue templates"?
2. ок.

для UDT - можно репро, на мыло?
21 авг 12, 16:01    [13044193]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Konst_One
Member

Откуда:
Сообщений: 11522
locky
Konst_One
кстати, тоже поддерживаю вопрос: что такое TBL005 (Index), в чём его суть?

категория Table design issue является экспериментальной и наиболее сырой.
В частности, TBL005 (Index) означает что найдены избыточные индексы (например idx1(FirstName,LastName) и idx2(FirstName) - idx2 является потенциально избыточным, т.к. покрывается индексом idx1)


спасибо, теперь понятно
21 авг 12, 16:03    [13044220]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
locky
Member

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

если кому-то вдруг придёт в голову идея о том, что "неплохо было бы проверять еще и такой вот момент" - буду рад услышать.
21 авг 12, 16:04    [13044234]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36989
locky
Гавриленко Сергей Алексеевич
пропущено...
С этим точно все нормально было. Буду копаться - покажу.

такое сообщение может появится также в случае, если не удалось проанализровать (в силу тех или иных причин) саму процедуру - и не удалось получить список её параметров.

ну и, разумеется, в случае банального бага
А, это да. Была часть unparsed-кода.

И, кстати, это точно надо ломаться с парсингом на полях с именами "hash" и "rows"?

Сообщение было отредактировано: 21 авг 12, 16:06
21 авг 12, 16:05    [13044246]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Гавриленко Сергей Алексеевич
locky
пропущено...

такое сообщение может появится также в случае, если не удалось проанализровать (в силу тех или иных причин) саму процедуру - и не удалось получить список её параметров.

ну и, разумеется, в случае банального бага
А, это да. Была часть unparsed-кода.

И, кстати, это точно надо ломаться с парсингом на полях с именами "hash" и "rows"?

По хорошему - не надо, разумеется
но так уж оно реализовано в текущей версии. особенности парсера.
21 авг 12, 16:07    [13044269]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
locky
1. что такое "issue templates"?
По смыслу то же самое, что Trace templates для профайлера.

locky
для UDT - можно репро, на мыло?
Отправлено.
21 авг 12, 16:53    [13044727]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
invm
locky
1. что такое "issue templates"?
По смыслу то же самое, что Trace templates для профайлера.

locky
для UDT - можно репро, на мыло?
Отправлено.


ага. предефайненые наборы установок для проверок

Спасибо.
21 авг 12, 16:54    [13044738]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
locky
проблема не в самом по себе rollback, а в потенциальном сообщении об ошибке
автор
Msg 266, Level 16, State 2, Procedure _testproc, Line 0
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing.
очень бы хотелось иметь переключатель для этого, но ведь никто не даст, хотя и просили, если правильно помню
Ну для подхода с TRY/CATCH такого нет, естественно. =)
А переключатель не дадут - это "стимул" для принудительного перехода на "новый подход".
21 авг 12, 18:01    [13045202]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
invm
Member

Откуда: Москва
Сообщений: 9351
Mnior
locky
проблема не в самом по себе rollback, а в потенциальном сообщении об ошибке
пропущено...
очень бы хотелось иметь переключатель для этого, но ведь никто не даст, хотя и просили, если правильно помню
Ну для подхода с TRY/CATCH такого нет, естественно. =)
А переключатель не дадут - это "стимул" для принудительного перехода на "новый подход".
С TRY/CATCH аналогично. Если мне не изменяет склероз, эта байда еще с сайбейза пришла. Так до сих пор и живет.
21 авг 12, 18:22    [13045334]     Ответить | Цитировать Сообщить модератору
 Re: SqlCodeGuard - бесплатный addin для SSMS  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
invm
С TRY/CATCH аналогично.
А как вы это определили, если TRY/CATCH ловит только первое сообщение?
locky
если кому-то вдруг придёт в голову идея о том, что "неплохо было бы проверять еще и такой вот момент" - буду рад услышать.
За тулзу огромнейший сенкс. Хоть я даже и 5 минут не "подержал в руках".
А как вы там всё проверяете? Вот в Code Analisis под VS (C#) можно свои custome rule писать.

По вопросу ссори, там у вас итак нехило количество правил.
Кстати предефайн стандартных правил было бы желательно.

Блин, анализ сложности кода - обоссаться.

А можно это не в Addin а командой, а лучше на стороне сервера (CLR)? Чтоб можно как для обычного программирования в MSBuild, так и здесь в среду контроля версий или пост билд/тест.

Code Outline - почти-почти свой форматер кода.
Правила стилизации, аля StyleCop

Object dependencies - может тут какой-нидь анализ придумать. Ну типа:
Повторное использование одинаковых выражений - видно кто VIEW ленится писать (обычные и параметризованные) или где проффтыкали.
Не знаю (пока не досмотрел, но скорее есть) как на счёт профтыканных FK. Или DELETE CASCADE без индексов (это уже не CA).
Частота использования фильтров, точнее - Column dependencies (с по типам операторов условий)
А можно как-то выгрузить/использовать в запросах эти dependencies?

SET-ы для кода, особенно когда используются индексированные представления, калькулируемые поля. Или просто не ANSI_NULS (скорее уже есть).

А оно как в будущем? OpenSource (скромная надежда) или монетизировать? Скорее MS-у продать.
И почему нет кнопочки Donate.

PS: Ссори за каламбур и щенячество.
21 авг 12, 23:02    [13046185]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить