Проверка синтаксиса все хранимые процедуры?

1120 Я знаю, что было дано много ответов, но ни один из них, похоже, не решал проблему. Вот мой взгляд на решение:

  1. Используйте метод
    , с которого начинается OP. Это работает очень хорошо, но иногда добавляет ? к URL. ? является главной проблемой.
  2. Используйте jQuery / JavaScript, чтобы сделать ссылку, следующую, когда JavaScript включен, чтобы ? не добавлялся к URL. Он будет легко возвращаться к методу для очень небольшой части пользователей, у которых не включен JavaScript.
  3. В коде JavaScript используется делегирование событий, поэтому вы можете присоединить прослушиватель событий до того, как или
  4. Код JavaScript предотвращает выполнение действия по умолчанию и затем следует по ссылке, указанной в атрибуте action.

Пример JSBin (фрагмент кода не может переходить по ссылкам)

// Listen for any clicks on an element in the document with the `link` class
$(document).on('click', '.link', function(e) {
    // Prevent the default action (e.g. submit the form)
    e.preventDefault();

    // Get the URL specified in the form
    var url = e.target.parentElement.action;
    window.location = url;
});



    
        
        
        Form buttons as links
    

    
        
        
            
            
        
    

18
задан Steve Homer 16 December 2016 в 10:58
поделиться

4 ответа

Кроме того, вы можете рассмотреть возможность использования Visual Studio Team System 2008 Database Edition , которая, помимо прочего, выполняет статическую проверку всех хранимых процедур в проекте при сборке. , таким образом гарантируя, что все согласовано с текущей схемой.

1
ответ дан 30 November 2019 в 09:15
поделиться

Немного затянувшийся вариант:

  1. Создать копию базы данных (резервное копирование и восстановление). Вы можете сделать это в целевой базе данных, если ваш уровень достоверности высок.
  2. Используйте SSMS для написания сценариев всех хранимые процедуры в один файл сценария
  3. УДАЛИТЬ все процедуры
  4. Запустить сценарий, чтобы воссоздать их. Все, что не может быть создано, выйдет из строя.

Пара суетливых ошибок, таких как:

  • Вы хотите, чтобы "если процедура существует" затем отпустите proc GO create proc ... GO " синтаксис для разделения каждой процедуры.
  • Вложенные процедуры завершатся ошибкой, если они вызовите процедуру, которая еще не была (повторно) создан. Запуск скрипта несколько раз должен уловить это (поскольку заказ их должным образом может быть настоящим боль).
  • Могут возникнуть другие, более непонятные проблемы, так что будьте осторожны.

Чтобы быстро отбросить 10 или 1000 процедур, запустите

SELECT 'DROP PROCEDURE ' + schema_name(schema_id) + '.' +  name
 from sys.procedures

, выберите результат и запустите его.

Предполагается, что вы делать очень нечастую задачу. Если вам нужно делать это регулярно (ежедневно, еженедельно ...), сообщите нам, почему!

0
ответ дан 30 November 2019 в 09:15
поделиться

Вы также можете сделать это «на месте» - не получите все утверждения.

В дополнение к настройке NOEXEC на , вам также нужно будет установить ваш любимый showplan_ * на (я использую showplan_text ). Теперь вы можете избавиться от своего шага 2 и просто выполнить каждую процедуру, которую вы получили на шаге 1.

Вот образец с использованием индивидуальной хранимой процедуры. Вы можете работать в свой любимый цикл:

create procedure tests @bob int as 
select * from missing_table_or_view
go 

set showplan_text on; 
go 

set noexec on 

exec tests 

set noexec off 
go 
set showplan_XML off 
go 
drop procedure tests 
go

Вышеуказанный образец должен генерировать следующий выход:

MSG 208, уровень 16, состояние 1, тесты процедуры, линия 2
Неверное имя объекта «SPACK_TABLE_OR_VIEW».

7
ответ дан 30 November 2019 в 09:15
поделиться

Нет никакого способа сделать это из T-SQL, или менеджера предприятия, поэтому мне пришлось что-то написать из кода клиента. Я не буду публиковать весь код здесь, но хитрость:

1) Получить список всех хранимых процедур

 SELECT ROUTINE_NAME AS StoredProcedureName
 FROM INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE' --as opposed to a function
 ORDER BY ROUTINE_NAME

2) Получить хранимую процедуру Создать T-SQL:

select
   c.text
from dbo.syscomments c
where c.id = object_id(N'StoredProcedureName')
order by c.number, c.colid
option(robust plan)

3) Запустите создание Заявление с NOEXEC ON, так что синтаксис проверяется, но на самом деле он не пытается создать сохраненную процедуру:

connection("SET NOEXEC ON", ExecuteNoRecords);
connection(StoredProcedureCreateSQL, ExecuteNoRecords);
connection("SET NOEXEC ON", ExecuteNoRecords);
0
ответ дан 30 November 2019 в 09:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: