これがパーティーに遅れていることは知っていますが、今日同じ問題を抱えていて、実際に問題を解決するものは何も見つからなかったので、すぐにスクリプトを作成しました。
基本的に、関数を使用して各計算列の列情報を保持する一時テーブルを作成し、テーブルから列を削除します。次に、関数を更新し、定義を使用してすべての列を再作成します。
定義内のパラメーターに変更を加える必要がある場合 (私の場合のように)、定義が再度作成される場所にその部分を単純にスクリプト化することができます。
インデックスまたはその他のニーズ内に計算列がある場合は、コードを簡単に拡張できますが、これは私のニーズの範囲を超えていました。
それが他の誰かに役立つことを願っています。
/* 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