質問

あなたはその式関数を呼び出す計算列であることをテーブルの列を設定する場合は、

は、その基礎となる機能を変更するには、痛みになります。すべての変更を使用すると、その式関数を参照するすべての単一の列を見つけるの参照を削除し、テーブルを保存し、機能を変更し、バックのすべてを追加し、再び保存する必要があります。でも、小さな変化は悪夢です。

あなたが関数は、式によって参照されていることを気にしないし、ちょうど先に行くと根本的な機能を変更するには、SQL Serverを伝えることはできますか?

追加の詳細: 計算列は持続するか、非決定論的であるため、FK制約によって参照されていません。機能を考慮に現在の時間がかかります。これは、レコードは有効期限が切れているか否かの問題を扱っています。

役に立ちましたか?

解決

いいえ、私の知る限りでは、あなたがこれを行うことはできません - あなたはまず、関数を参照すべての計算カラムを削除する機能を変更して、計算列を再作成する必要があります。

たぶんMSは私たちのSQL Server 2010/2011の "CREATEまたはALTER FUNCTION" コマンドを与えるのだろうか? : - )

マルク

他のヒント

ALTERの結果は巨大な可能性があります。

あなたは列のインデックスを作成したことがありますか? SCHEMABINDINGとビューでそれを使用?それを持続?それへの外部キー関係?

何ALTERは、データ型、NULL値の許容または決定論を変更する場合はどうなりますか?

これは、非常に多くのシナリオとの契約よりも依存関係を持つALTER機能を停止する方が簡単です。

この後半の答えのために申し訳ありませんが、それが有用であることができます。

あなたはあなたの本当の関数を呼び出します、各計算列のためのダミー関数を使用することができます。

  

例:
  dbo.link_comp(「123」)
:計算列は、以下の式を使用します   この関数は、引数やコールを転送して、関数dbo.link(「123」)(あなたの本当の機能)
を返します   どちらの関数がちょうど同じ引数を使用し、同じ型を返す必要があります。

すると、ロックされている機能はdbo.link_compで、あなたはまだdbo.linkを変更することができます。
また、あなたの関数は、他のSQLから呼び出された場合、あなたはまだダミー関数dbo.link_compのみ計算列のためである、あなたの本当の関数名dbo.linkを使用することができます。

C4が計算列である列C1、C2、C3、C4、C5とテーブルT1を想定

また仮定あなたはNewFuncに置き換えることにしたいC4参照機能OldFunc

まず、一時テーブルへのすべての行からの非計算カラムを移動

Select C1, C2, C3, C5 into TmpT1 from T1
Go

次に、T1からすべての行を削除

Delete From T1
go

今あなたが変更することができ、カラムC4

Alter table T1 alter column C4 as dbo.NewFunc()
Go

これで元のテーブルに保存されたデータを置く

Insert Into T1 (C1,C2,C3,C5) select C1,C2,C3,C5 from TmpT1

これで一時テーブルを削除します。

Drop Table TmpT1

あなたはいくつかの良いスキーマを試みることができるが、あなたのためのスクリプトを作成するツールを比較します。)

<ストライキ>あなたは、計算されないことが列を変更し、TRIGGERことによってそれを更新することができます。

それとも、何か他のものにテーブルの名前を変更する計算列を削除し、(すなわち、元のテーブル名を指定して)元のテーブルの代わりにビューを作成し、必要な「計算された」列を含む可能性があります。

編集:元のテーブル名(今VIEW)にあなたのインサートを、この5月の混乱を注意してください。もちろん、あなたが、古いテーブルを保持し、計算列を削除し、計算列が含まれて別のビューを作成することができます。

私たちは、計算カラムの周りに彼らは、彼らが得るより多くの問題です決めたのに十分な時間を仕事に持っていました。フェイルSAFインサート(1)、計算カラムを持つテーブル、ようにSET ARITHABORTをいじりと必要なものにビューに挿入しようとします。

(1)当社は、フェイルセーフいるような挿入:

...

MyOtherTable FROM MyTableとSELECT *。INSERT INTO

新しい列が追加のテーブルおよび他のない場合に失敗するように設計されています。計算列で、私たちは私たちにそのセーフティネットを失う、明示的にすべての列に名前を付ける必要があります。

私は、これはパーティーに遅れているが、私は今日、この同じ問題を抱えていたと私はすぐに1つのアウトをスクリプト化して、実際に問題を解決して何かを見つけることができませんでした知っています。

基本的にそれが機能を使用して計算された各列の列情報を保持する一時テーブルを作成し、テーブルから列を削除します。次に、あなたの機能を更新し、それがその定義で再びすべての列を再作成してみましょう。

あなたは(私がする必要があるように)定義内のパラメータに変更を加える必要がある場合することができます定義が再作成される場所に別れる単にスクリプトます。

あなたは簡単にコードに展開することができますインデックスやその他のニーズ内の列を計算しているが、これは私のニーズの範囲を超えた場合。

は、それが他の誰かに役立ちます願っています。

/* 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top