2015-05-15 3 views
3

Я пытаюсь сохранить старую хранимую процедуру в строку. Когда я использую следующее, я не получаю никаких разрывов строк.Получить текст хранимой процедуры в SQL Server

SELECT @OldProcedure = Object_definition(object_id) 
FROM sys.procedures 
WHERE name = @ProcedureName 

Любые предложения о том, как получить текст хранимой процедуры с разрывами строк?

Я думал об использовании sp_helptext

Благодарности

Update

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

Что касается скрипта, так как я сохраняю результаты в поле db. Я создаю инструмент, который будет генерировать процедуры «на лету», но я хотел создать их историю.

Update

Оказалось, что Object_definition делает то, что я хочу, но по какой-то причине, когда я скопировать его из результатов я получаю одну строку.

Declare @sql varchar(max) ; 
SELECT @sql=Object_definition(object_id) 
FROM sys.procedures 
WHERE name = 'Test_QueryBuilder'; 

drop procedure Test_QueryBuilder 
exec(@sql) 
print @sql 
+2

Как вы знаете, нет ли перерывов на линии? Вы смотрите на это в SSMS? Если это так, вам просто нужно установить вывод в текст вместо сетки, и он покажет вам форматированный текст. –

+3

Почему бы просто не просмотреть их в SQL Server Management Studio и файл «Script to» или окно запроса? – BrianAtkins

+1

sp_helptext - это действительно путь. Вы получите точное определение вашей процедуры, поскольку оно было/будет скомпилировано на сервере. – Louis

ответ

5

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

DECLARE @Lines TABLE (Line NVARCHAR(MAX)) ; 
DECLARE @FullText NVARCHAR(MAX) = '' ; 

INSERT @Lines EXEC sp_helptext 'sp_ProcedureName' ; 
SELECT @FullText = @FullText + Line FROM @Lines ; 

PRINT @FullText ; 

Он просто использует sp_helptext, как Вы предложили, выхватывает свой вывод в табличной переменной и объединяющее все получившиеся строки в текстовой переменной. Он также использует тот факт, что каждая строка в наборе результатов sp_helptext включает в себя завершающий новый символ строки, поэтому нет необходимости добавлять его сюда.

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

+0

Это работает. Но вам просто нужно добавить DECLARE @NewLineChar AS CHAR (2) = CHAR (13) + CHAR (10) – H20rider

+0

Зачем? Как эта строка соответствует моему примеру? – Alejandro

3

Я настоятельно рекомендую просто с помощью «сценарий для» функции в SQL Server Management Studio:

enter image description here

Я имел большое использование этого в прошлом, когда дело со старыми объектами подобный Stored Procedures.

+0

есть. Но я хочу сохранить результаты в БД. – H20rider

+0

Разве они не находятся в БД? – Anon

+0

Сохраните результаты или создайте объекты в новой базе данных? Каков ваш прецедент, если вы хотите сохранить объекты базы данных в таблице? – BrianAtkins

2

Два способа:

select name, object_definition(object_id) 
from sys.procedures 

или

select object_name(object_id), definition 
from sys.sql_modules as m 
join sys.procedures as p 
    on m.object_id = p.object_id 
1

Это звучит, как вы хотите, чтобы войти текст процедуры каждый раз, когда она меняется. Вы можете сделать это автоматически с помощью DDL Trigger. В отличие от триггеров DML, которые срабатывают при внесении изменений в данные, они активируют изменения в базе данных.

Создать таблицу для хранения в журнал аудита

CREATE TABLE DDLAudit_Procedure_log (event_instance xml); 

Создать триггер для заполнения таблицы журнала аудита

CREATE TRIGGER trg__DDLAudit_Procedure 
ON DATABASE 
FOR 
    CREATE_PROCEDURE 
,ALTER_PROCEDURE 
AS 
BEGIN 
    INSERT DDLAudit_Procedure_log 
     (event_instance) 
    SELECT EVENTDATA(); 
END 

После создания ваши автогенерируемые процедуры, проверьте журнал

SELECT * 
FROM DDLAudit_Procedure_log 
WHERE event_instance.value('(//ObjectName)[1]','sysname') = 'MyAutoGeneratedProc' 
ORDER BY event_instance.value('(//PostTime)[1]','datetime') 

Это простой пример. Вы можете проверить содержимое EVENTDATA() внутри триггера для фильтрации для определенных таблиц. Страница справки MSDN имеет более подробную информацию.

Смежные вопросы