2

Sql Server 2005 および 2008 の場合、特定のテーブルに列が既に存在するかどうかを確認し、存在しない場合は作成します。この新しい列には、ExistingColumn の既定値が必要です。現在、SQLサーバーが構文エラーを訴えるため、動的SQLを使用して新しい列を埋める必要があります。

現在のSQLサーバーコードは次のとおりです。

IF NOT EXISTS (SELECT TOP 1 1 FROM sys.columns WHERE [name] = N'NewColumn' AND OBJECT_ID = OBJECT_ID(N'ExistingTable'))
BEGIN
    ALTER TABLE [dbo].[ExistingTable] ADD [NewColumn] VARCHAR(50) NULL;

    exec sp_executesql  N'UPDATE [dbo].[ExistingTable] SET NewColumn = ExistingColumn'

    ALTER TABLE [dbo].[ExistingTable] ALTER COLUMN  [NewColumn] VARCHAR(50) NOT NULL 
END
GO

動的 SQL に頼らずにこの問題を解決する方法はありますか?

4

2 に答える 2

2

SQL Server は、実行前にALTERステートメントを解析し、 「そのような列はありません」と言っています。パーサーはIF他の分岐を理解せず、DDL と DML を混在させるとイベントのシーケンスをたどることができません。または、イベントのシーケンスと実行時に発生する分岐を予測できません。

遅延名前解決では、まだ存在しないオブジェクトにはアクセスできますが、存在するオブジェクトのまだ存在しないにはアクセスできません。

したがって、動的 SQL は、あなたがしなければならない方法のように思えます。

于 2013-03-07T19:12:42.977 に答える