[mssql] как получить код объекта? (SP,TR,VW,FN,...)
От: Хемуль  
Дата: 25.12.15 10:22
Оценка:
Нашёлся такой баг: после переименования объекта без последующей его рекомпиляции в syscomments остается его старое название.
Соответственно sp_helptext возвращает туфту:

CREATE PROC sp_OLD_name AS PRINT 1
GO
EXEC sp_rename 'sp_OLD_name', 'sp_NEW_name'
EXEC sp_helptext 'sp_NEW_name'

Результат

CREATE PROC sp_OLD_name AS PRINT 1



Подскажите пож-та более лучший алгоритм программного скриптования объектов
Отредактировано 25.12.2015 10:23 Хемуль . Предыдущая версия .
Re: [mssql] как получить код объекта? (SP,TR,VW,FN,...)
От: Nikita123 Россия  
Дата: 25.12.15 10:39
Оценка:
Здравствуйте, Хемуль, Вы писали:

Х>Нашёлся такой баг: после переименования объекта без последующей его рекомпиляции в syscomments остается его старое название.

Х>Соответственно sp_helptext возвращает туфту:

Х>
Х>CREATE PROC sp_OLD_name AS PRINT 1
Х>GO
Х>EXEC sp_rename 'sp_OLD_name', 'sp_NEW_name'
Х>EXEC sp_helptext 'sp_NEW_name'
Х>

Х>Результат
Х>

Х>CREATE PROC sp_OLD_name AS PRINT 1



Х>Подскажите пож-та более лучший алгоритм программного скриптования объектов
Желаю успеха,
Никита.
Re: [mssql] как получить код объекта? (SP,TR,VW,FN,...)
От: Nikita123 Россия  
Дата: 25.12.15 10:45
Оценка:
Здравствуйте, Хемуль, Вы писали:

Х>Нашёлся такой баг: после переименования объекта без последующей его рекомпиляции в syscomments остается его старое название.

Х>Соответственно sp_helptext возвращает туфту:

Х>
Х>CREATE PROC sp_OLD_name AS PRINT 1
Х>GO
Х>EXEC sp_rename 'sp_OLD_name', 'sp_NEW_name'
Х>EXEC sp_helptext 'sp_NEW_name'
Х>

Х>Результат
Х>

Х>CREATE PROC sp_OLD_name AS PRINT 1

Х>Подскажите пож-та более лучший алгоритм программного скриптования объектов
Зачем делать без рекомпиляции? От этого ошибка.
Для объектов надо делать DROP и потом CREATE или CREATE OR REPLACE (без DROP).
Желаю успеха,
Никита.
Re[2]: [mssql] как получить код объекта? (SP,TR,VW,FN,...)
От: Хемуль  
Дата: 25.12.15 10:57
Оценка:
N>Зачем делать без рекомпиляции? От этого ошибка.
Ошибка или нет — это к SSMS прекрасно дёргующей sp_rename по F2. Мой вопрос в другом
Re: [mssql] как получить код объекта? (SP,TR,VW,FN,...)
От: Olaf Россия  
Дата: 25.12.15 19:22
Оценка:
Здравствуйте, Хемуль, Вы писали:

Х>Нашёлся такой баг: после переименования объекта без последующей его рекомпиляции в syscomments остается его старое название.

Х>Соответственно sp_helptext возвращает туфту:

Х>...


Х>Подскажите пож-та более лучший алгоритм программного скриптования объектов


В документации к sp_rename два упоминания, которые предостерегают от использования этой функции в определенных случаях.

1. Changing any part of an object name can break scripts and stored procedures. We recommend you do not use this statement to rename stored procedures, triggers, user-defined functions, or views; instead, drop the object and re-create it with the new name.


2. Renaming a stored procedure, function, view, or trigger will not change the name of the corresponding object name in the definition column of the sys.sql_modules catalog view. Therefore, we recommend that sp_rename not be used to rename these object types. Instead, drop and re-create the object with its new name.


Отсюда следует, что при переименовании ХП невозможно получить правильное определение объекта. Но вот, что интересно — SSMS при попытке сгенерировать CREATE выражение для вашей процедуры формирует его правильно, т.е. с новым именем.

Анализ содержимого профайлер при выполнении пункта меню Script Stored Procedure As -> CREATE To показал, что текст ХП SSMS извлекает через запрос
exec sp_executesql N'SELECT
NULL AS [Text],
ISNULL(smsp.definition, ssmsp.definition) AS [Definition]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
WHERE
(sp.type = @_msparam_0 OR sp.type = @_msparam_1 OR sp.type=@_msparam_2)and
(sp.name=@_msparam_3 and SCHEMA_NAME(sp.schema_id)=@_msparam_4)'
,N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),
@_msparam_3 nvarchar(4000),@_msparam_4 nvarchar(4000)',@_msparam_0=N'P',@_msparam_1=N'RF',
@_msparam_2=N'PC',@_msparam_3=N'sp_NEW_name',@_msparam_4=N'dbo'
,
где в определении возвращается старое имя CREATE PROC sp_OLD_name AS PRINT 1, но пользователь при генерации скрипта получает новое.

Подозреваю, что даже сам Microsoft страдает из-за этой проблемы и для ее решения просто разбирает выражение CREATE PROC sp_OLD_name AS, где находит старое имя и заменяет его на новое. Других вариантов по всей видимости нет.
Re: [mssql] как получить код объекта? (SP,TR,VW,FN,...)
От: MasterZiv СССР  
Дата: 09.02.16 06:52
Оценка:
Х>Нашёлся такой баг: после переименования объекта без последующей его рекомпиляции в syscomments остается его старое название.
Х>Соответственно sp_helptext возвращает туфту:

Тоже мне, нашли проблему...
Кого метёт что там в syscomments?
Код там хранится не должен, всё в репозитории, там -- только для справки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.