Как посмотреть код процедуры ms sql

хранимую — как посмотреть код процедуры ms sql

Как проверить, существует ли хранимая процедура до ее создания (12)

** Самый простой способ сбросить и воссоздать хранимую процедуру в T-Sql — это **

У меня есть SQL-скрипт, который нужно запускать каждый раз, когда клиент выполняет функциональность «Управление базой данных». Сценарий включает создание хранимых процедур в базе данных клиента. Некоторые из этих клиентов могут уже иметь хранимую процедуру при запуске скрипта, а некоторые — нет. Мне нужно, чтобы отсутствующие хранимые процедуры добавлялись в клиентскую базу данных, но неважно, насколько я пытаюсь сгибать синтаксис T-SQL, я получаю

CREATE / ALTER PROCEDURE ‘должен быть первым оператором в пакете запросов

Я прочитал это, прежде чем создавать работы, но мне не нравится это делать.

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

CREATE, ЕСЛИ НЕ СУЩЕСТВУЕТ «Ваше прок-имя» () BEGIN . END

В дополнение к ответу от @Geoff я создал простой инструмент, который генерирует SQL-файл, который содержит инструкции для хранимых процедур, представлений, функций и триггеров.

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

UPDATE: вы можете также обернуть весь этот вызов в транзакции. Включение многих хранимых процедур в одну транзакцию, которая может все совершить или все откат. Еще одно преимущество обертывания в транзакции — хранимая процедура всегда существует для других соединений SQL, если они не используют уровень изоляции транзакций READ UNCOMMITTED!

1) Чтобы избежать изменения, как решение процесса. Наши процессы всегда должны быть ЕСЛИ СУЩЕСТВУЮТ, ЧТОБЫ СОЗДАТЬ. Если вы делаете тот же шаблон, предполагая, что новый PROC — это желаемый процесс, обслуживание альтернатив немного сложнее, потому что у вас будет IF EXISTS ALTER ELSE CREATE.

2) Вы должны поставить CREATE / ALTER в качестве первого вызова в пакетном режиме, чтобы вы не могли обернуть последовательность обновлений процедур в транзакции вне динамического SQL. В принципе, если вы хотите запустить целый пакет обновлений процедур или отбросить их обратно, не восстанавливая резервную копию БД, это способ сделать все в одной партии.

Вы можете запускать процедурный код везде, где вы можете запускать запрос.

Просто скопируйте все после AS :

Этот код выполняет то же самое, что хранится в proc, но не хранится на стороне базы данных.

Это похоже на анонимную процедуру в PL/SQL .

Обновить:

Заголовок вопроса немного запутан.

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

Вот что выводит SSMS в сценарий создания:

Обновить:

Пример того, как это сделать при включении схемы:

В приведенном выше примере dbo является схемой.

Обновить:

В SQL Server 2016+ вы можете просто сделать

CREATE OR ALTER PROCEDURE dbo.MyProc

Если вы ищете самый простой способ проверить существование объекта базы данных перед его удалением, вот один из способов (пример использует SPROC, как и ваш пример выше, но может быть изменен для таблиц, индексов и т. Д.):

Это быстро и элегантно, но вам нужно убедиться, что у вас есть уникальные имена объектов во всех типах объектов, поскольку это не учитывает это.

Надеюсь, это поможет!

Начиная с SQL SERVER 2016 вы можете использовать новую DROP PROCEDURE IF EXISTS .
DROP < PROC | PROCEDURE >[ IF EXISTS ] < [ schema_name. ] procedure >[ . n ]

Проверьте IF Exist для сохраненной процедуры

У меня, видимо, нет репутации, необходимой для голосования или комментариев, но я просто хотел сказать, что ответ Джеффа с использованием EXEC (sp_executesql может быть лучше), безусловно, способ пойти. Отбрасывание, а затем повторное создание хранимой процедуры завершается в конце, но есть момент, когда хранимая процедура вообще не существует, и это может быть очень плохо, особенно если это то, что будет многократно повторяйте. У меня возникли проблемы со своим приложением, потому что фоновый поток выполнял IF EXISTS DROP . CREATE, в то время как другой поток пытался использовать хранимую процедуру.

Я думаю! Почему я не пишу весь запрос, как

я уже знаю, что первые две процедуры уже существуют sql будет запускать запрос даст ошибку первых двух процедур, но все же он будет создавать последнюю процедуру SQl сам позаботится о том, что уже существует, это то, что я всегда делаю со всеми моими клиенты!

Я знаю, что это очень старая должность, но так как это отображается в лучших результатах поиска, поэтому добавление последнего обновления для тех, кто использует SQL Server 2016 SP1

Это создает хранимую процедуру, если она еще не существует, но изменяет ее, если она существует.

sql-server — это — как посмотреть код процедуры ms sql

Программно получить источник хранимой процедуры SQL Server, который идентичен источнику, возвращенному в SQL Server Management Studio gui? (6)

Вам придется сдать его код, SQL Profiler показывает следующее.

SMSE выполняет довольно длинную строку запросов, когда генерирует оператор.

Следующий запрос (или что-то в его строках) используется для извлечения текста:

Он возвращает чистый CREATE, который затем заменяется кодом ALTER.

Наборы SET ANSI NULL, а также инструкции GO и даты — все это добавлено к этому.

Пойдите с sp_helptext, его проще .

Любые указатели на то, как я могу программно получить точно такой же источник хранимой процедуры из SQL Server 2005, как если бы я щелкнул правой кнопкой мыши по этой хранимой процедуре в SQL Server Management Studio и выберете вариант?

Я пытаюсь использовать SMO, но есть некоторые текстовые отличия. Процедура всегда имеет CREATE, а не ALTER, и есть некоторые отличия в заголовке, такие как отсутствие GO в версии, которую я получаю программно. Я могу это исправить, но, может быть, есть лучший способ?

Опять же, я нахожусь в SQL Server 2005, используя SMSE. Использование SMO через Visual Studio 8 2008.

Обновление . Получите ответы, которые расскажут об основах восстановления хранимой процедуры. Я ищу, чтобы получить текст, идентичный (или почти идентичный) тому, что генерирует GUI.

Пример: для sp_mysp щелкните правой кнопкой мыши в Management Studio, выберите вариант. Это генерирует:

Я хотел бы программным образом получить то же самое (обратите внимание на GO в заголовке и на то, что это ALTER PROCEDURE. В идеале я хотел бы получить это с минимальным программным исправлением извлеченного источника.

Я был бы рад получить только то, что отличалось от деталей даты сценария. , ,

Вы сказали программно, верно? Надеюсь, C # в порядке. Я знаю, что вы сказали, что вы пробовали SMO, и это не совсем так, как вам хотелось бы, так что это, вероятно, не будет идеальным для вашего запроса, но будет программным образом читать законные операторы SQL, которые вы могли бы запустить, чтобы воссоздать хранимую процедуру. Если у него нет необходимых операторов GO , вы можете предположить, что каждая из строк в StringCollection может иметь GO после него. Вы не можете получить этот комментарий с датой и временем в нем, но в моем похожем проекте (широкомасштабном инструменте развертывания, который должен выполнять резервное копирование всего по отдельности) это было сделано довольно красиво. Если у вас есть предварительная база, из которой вы хотите работать, и у вас все еще есть исходная база данных для ее запуска, я бы подумал о том, чтобы отбросить начальные усилия и рестайлинг на этом выходе.

Чтобы изменить хранимую процедуру, вот код C #:

Что нужно отметить:

  1. Убедитесь, что USER в строке подключения имеет право изменять SP
  2. Удалите все команды GO,SET ANSI_NULLS XX,SET QUOTED_IDENTIFIER из файла сценария. (Если вы этого не сделаете, SqlCommand выдает ошибку).

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

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

Или ленивый подход:

Мастер публикации Databse может сбрасывать схему (и другие объекты) из командной строки.

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

Обновление: Дэвид пишет, что это не похоже на его sproc . возможно, потому что он возвращает строки как «записи» для сохранения форматирования? Если вы хотите увидеть результаты в более «естественном» формате, вы можете сначала использовать Ctrl-T (вывод в виде текста), и он должен распечатать его точно так же, как вы его ввели. Если вы делаете это в коде, тривиально делать foreach, чтобы собрать ваши результаты точно так же.

Обновление 2: это предоставит источнику «ПРОЦЕДУРА СОЗДАНИЯ», а не «ПРОЦЕДУРА ALTER», но я не знаю, как использовать его вместо «ALTER». Впрочем, какая-то тривиальная вещь, не правда ли?

Обновление 3: см. Комментарии для получения дополнительной информации о том, как поддерживать SQL DDL (структуру базы данных) в системе управления версиями. Это действительно ключ к этому вопросу.

Хранимые процедуры

Нередко операция с данными представляет набор инструкций, которые необходимо выполнить в определенной последовательности. Например, при добавлении данных покупки товара необходимо внести данные в таблицу заказов. Однако перед этим надо проверить, а есть ли покупаемый товар в наличии. Возможно, при этом понадобится проверить еще ряд дополнительных условий. То есть фактически процесс покупки товара охватывает несколько действий, которые должны выполняться в определенной последовательности. И в этом случае более оптимально будет инкапсулировать все эти действия в один объект — хранимую процедуру (stored procedure).

То есть по сути хранимые процедуры представляют набор инструкций, которые выполняются как единое целое. Тем самым хранимые процедуры позволяют упростить комплексные операции и вынести их в единый объект. Изменится процесс покупки товара, соответственно достаточно будет изменить код процедуры. То есть процедура также упрощает управление кодом.

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

И еще один важный аспект — производительность. Хранимые процедуры обычно выполняются быстрее, чем обычные SQL-инструкции. Все потому что код процедур компилируется один раз при первом ее запуске, а затем сохраняется в скомпилированной форме.

Для создания хранимой процедуры применяется команда CREATE PROCEDURE или CREATE PROC .

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

Например, пусть в базе данных есть таблица, которая хранит данные о товарах:

Создадим хранимую процедуру для извлечения данных из этой таблицы:

Поскольку команда CREATE PROCEDURE должна вызываться в отдельном пакете, то после команды USE, которая устанавливает текущую базу данных, используется команда GO для определения нового пакета.

После имени процедуры должно идти ключевое слово AS.

Для отделения тела процедуры от остальной части скрипта код процедуры нередко помещается в блок BEGIN. END:

После добавления процедуры мы ее можем увидеть в узле базы данных в SQL Server Management Studio в подузле Programmability -> Stored Procedures :

Хранимые процедуры в MS SQL 2008

В базе данных есть хранимые процедуры (использую ms sql 2008 r2).

База Данных — Программирование — Хранимые процедуры.

Хочу посмотреть код хранимой процедуры, вызываю контекстное меню (правой кнопкой по процедуре), но там нет такого пункта. Есть только «Изменить». При нажатии, как я понимаю, Create Procedure заменяется на Alter Procedure . Собственно вопрос, есть ли нормальный способ посмотреть код процедуры? Надо ли каждый раз заменять Alter Procedure на Create Procedure после «просмотра» или это особо не влияет на работу процедуры?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *