Я знаю, что это уже поздно для вечеринки, но сегодня у меня была такая же проблема, и я не нашел ничего, что действительно решает проблему, поэтому я быстро написал сценарий.
По существу он создает временную таблицу, содержащую информацию о столбцах для каждого вычисленного столбца с использованием этой функции, удаляет столбцы из таблиц. Затем вы обновляете свою функцию и позволяете ей снова воссоздать все столбцы с их определениями.
Если вам нужно внести изменения в параметры в определениях (например, мне нужно), вы можете просто скомпоновать эту часть, в которой снова создаются определения.
Если у вас есть расчетные столбцы внутри индексов или других потребностей, вы можете легко расширить код, но это выходит за рамки моих потребностей.
Надеюсь, это может быть полезно кому-то еще.
/* Create temporary table to hold definitions */
CREATE TABLE [#FUNCTION]
(
[TABLE_NAME] nvarchar(255) NOT NULL,
[COLUMN_NAME] nvarchar(255) NOT NULL,
[DEFINITION] nvarchar(255) NOT NULL
)
GO
/* Add data to temp table */
INSERT INTO [#FUNCTION] ([TABLE_NAME], [COLUMN_NAME], [DEFINITION])
SELECT TABLE_NAME, COLUMN_NAME, definition FROM INFORMATION_SCHEMA.COLUMNS
INNER JOIN sys.computed_columns ON (object_id = object_id(TABLE_NAME) AND name = COLUMN_NAME)
WHERE definition LIKE '%MyFunctionName%'
GO
/* Remove columns */
DECLARE @TABLE_NAME nvarchar(255)
DECLARE @COLUMN_NAME nvarchar(255)
DECLARE c_CursorName CURSOR LOCAL FOR SELECT [TABLE_NAME], [COLUMN_NAME] FROM [#FUNCTION]
OPEN c_CursorName
FETCH NEXT FROM c_CursorName INTO @TABLE_NAME, @COLUMN_NAME
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('ALTER TABLE [' + @TABLE_NAME + '] DROP COLUMN [' + @COLUMN_NAME + ']')
FETCH NEXT FROM c_CursorName INTO @TABLE_NAME, @COLUMN_NAME
END
CLOSE c_CursorName
DEALLOCATE c_CursorName
GO
/* Update function */
-- Update function here
GO
/* Recreate computed columns */
DECLARE @TABLE_NAME nvarchar(255)
DECLARE @COLUMN_NAME nvarchar(255)
DECLARE @DEFINITION nvarchar(255)
DECLARE c_CursorName CURSOR LOCAL FOR SELECT [TABLE_NAME], [COLUMN_NAME], [DEFINITION] FROM [#FUNCTION]
OPEN c_CursorName
FETCH NEXT FROM c_CursorName INTO @TABLE_NAME, @COLUMN_NAME, @DEFINITION
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('ALTER TABLE [' + @TABLE_NAME + '] ADD [' + @COLUMN_NAME + '] AS ' + @DEFINITION)
FETCH NEXT FROM c_CursorName INTO @TABLE_NAME, @COLUMN_NAME, @DEFINITION
END
CLOSE c_CursorName
DEALLOCATE c_CursorName
GO
/* Remove temp table */
DROP TABLE [#FUNCTION]
GO
Я согласен, что это БОЛЬШАЯ боль! Чувствую это прямо сейчас! –
У меня такая же проблема.Я предполагаю, что есть веская причина, почему MS SQL не позволяет этого, но тем не менее, его реальная боль (+1 для общего горя) –