Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перекомпиляция функций и процедур  [new]
PavelT100
Member

Откуда: Москва
Сообщений: 219
Написал функцию:

ALTER FUNCTION [dbo].[sf_AAAfile](@dtFile as date)
RETURNS TABLE
AS
RETURN (SELECT * FROM AAA
WHERE dtFile = @dtFile)


Потом добавил несколько полей в середину таблицы AAA.

Результат превзошёл все ожидания.
Функция стала возвращать старое количество полей, названия у них были старые, но содержание уже соответствовало тем полям, которые я добавил. Хорошо, что я это визуально заметил. А мог бы и не заметить. Помогло простое alter function.

Можно ли принудительно заставить перекомпилироваться все функции и процедуры использующие заданную таблицу. Подозреваю, что '*' писать в таких функциях нежелательно, но уж больно не хочется писать все поля и потом их руками везде исправлять.
14 окт 14, 13:22    [16701681]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпиляция функций и процедур  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelT100
Можно ли принудительно заставить перекомпилироваться все функции и процедуры использующие заданную таблицу.

Функции и представления.
Процедуры не надо.

PavelT100
но уж больно не хочется писать все поля и потом их руками везде исправлять.

А сейчас вы что делаете с помощью alter function ?
14 окт 14, 13:25    [16701696]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпиляция функций и процедур  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
PavelT100,

sp_refreshsqlmodule

автор
Подозреваю, что '*' писать в таких функциях нежелательно

Это точно. То же самое и в представлениях. Если лень все поля перечислять - перетаскиваете их из Object Explorer в SSMS или ALT+F1 на таблице и Copy/Paste.
14 окт 14, 13:26    [16701708]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпиляция функций и процедур  [new]
PavelT100
Member

Откуда: Москва
Сообщений: 219
Glory
А сейчас вы что делаете с помощью alter function ?


А сейчас я как раз и исправлял с помощью alter function такую ситуацию.

Конечно, правильней бы было отказаться от звёздочки. Но в этом случае надо не забывать при изменении таблицы, корректировать и все функции. А звёздочка в этом плане, я думал, помогала бы.
14 окт 14, 13:33    [16701757]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпиляция функций и процедур  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelT100
Но в этом случае надо не забывать при изменении таблицы, корректировать и все функции.

Млин.
Ну так вы и сейчас будете это делать - выполнять какие-то изменения в функции.
14 окт 14, 13:35    [16701777]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпиляция функций и процедур  [new]
Crimean
Member

Откуда:
Сообщений: 13147
PavelT100
Конечно, правильней бы было отказаться от звёздочки. Но в этом случае надо не забывать при изменении таблицы, корректировать и все функции. А звёздочка в этом плане, я думал, помогала бы.


неверно. новое поле нужно только тогда, когда им начали пользоваться. значит "получающий" код после добавления поля должен быть явно изменен. а пока получающий код неизменен - добавление поля в таблицу никого вообще никак не волнует. так что пишите поля явно и не парьтесь.
14 окт 14, 13:37    [16701791]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпиляция функций и процедур  [new]
Диам
Member

Откуда:
Сообщений: 1497
Если не хотите таких проблем то возьмите себе за правило добавлять новые поля только в конец таблицы, а не в середину. Полностью вашу проблему это не решит, но по крайней мере не будет такой ситуации, когда в одних полях данные из других полей.
А вьюхи, таки, да, желательно обязательно создавать с перечислением всех полей.
15 окт 14, 22:27    [16710620]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпиляция функций и процедур  [new]
Диам
Member

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

declare @vname nvarchar(50)

SELECT TABLE_NAME
INTO #T
FROM INFORMATION_SCHEMA.VIEWS 

DECLARE Cur CURSOR  FOR
SELECT TABLE_NAME
FROM #T
ORDER BY TABLE_NAME

Open Cur

FETCH NEXT FROM Cur INTO @vname 

WHILE @@FETCH_STATUS = 0 BEGIN
	BEGIN TRY
		exec sp_refreshview @vname		
		--exec sp_refreshview 'Dogovor_Odobril_Vspom_View'
	END TRY
	BEGIN CATCH
		print @vname + ': ' + error_message()
		IF XACT_STATE() = 1
		BEGIN
			PRINT 'Транзакцию можно зафиксировать, commit'
			COMMIT TRANSACTION;
		END;

		IF XACT_STATE() = -1
		BEGIN
			PRINT 'Транзакцию нельзя зафиксировать, rollback'
			ROLLBACK TRANSACTION;
		END;
	END CATCH
	FETCH NEXT FROM Cur INTO @vname 
END

DROP TABLE #T
CLOSE Cur
DEALLOCATE Cur
15 окт 14, 22:29    [16710634]     Ответить | Цитировать Сообщить модератору
 Re: Перекомпиляция функций и процедур  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Диам,

Идеяя автоматизации данного процесса состоит в следующем:

1.Создать DDL триггер на базу.
2.В триггере при изменении объекта - находить все зависящие от него объекты (по sys.sql_dependencies) (и те которые зависят от них и т.п. т.е. рекурсивным поиском) и делать явно alter object.

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

Я как-то делал ЭТО лет 5 назад.
можете посмотреть мои древние темы.
16 окт 14, 12:16    [16712852]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить