2012-03-19 16 views
0

1つのテーブルの存在をチェックするifステートメントで次のSQLスクリプトを囲む必要があります。ステートメントにはさらに多くのフィールドがありますが、下のスニペットはそのアイディアを得るのに十分なはずです。sqlスクリプトのifとgoステートメント

if文でこのバッチ全体を囲むと、私は文章の間にGOsがあるのが好きではありません。私がGOを取り出すと、TMP_FIELDが無効な列であると不平を言う。

これを行うにはどうすればよいですか?私がしているのは、フィールドの束を取ってvarcharからdatetimeに変えることだけです。これはsetup.exeファイルの一部なので、一度だけ実行する必要があり、将来のアップグレードでは必要ありません。特定のテーブルが存在する場合は、スクリプトを実行しないでください。

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE ADD TMP_FIELD datetime 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    UPDATE MY_TABLE SET TMP_FIELD = modifiedDate 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE DROP COLUMN modifiedDate 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE ADD modifiedDate datetime 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    UPDATE MY_TABLE SET modifiedDate = TMP_FIELD 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE DROP COLUMN TMP_FIELD 
GO 
+0

私はGOを取り出すと、modifiedDateに関するエラーが発生します。もしかして? 「GOを取り出すと、_modifiedDate_が無効な列であると不平を言う。 –

+0

TMP_FIELDは無効な列です。 – Rod

+0

私がテストしていたときにテーブルMY_TABLEを別に定義したと思います。私はテーブルスキーマにmodifiedDataという列を含めなかった。最初は例をあまり詳しく読んでいなかったので、作業している元のテーブルのスキーマはわかりませんでした。 –

答えて

1

列のタイプを変更するために体操的に行う必要はありませんか?

create table MY_TABLE (
    modifiedDate varchar(20) 
) 
go 

insert MY_TABLE (modifiedDate) values ('2012-10-20 17:50:41') 
go 

select * from MY_TABLE 
go 

alter table MY_TABLE alter column modifiedDate datetime 
go 

select * from MY_TABLE 
go 

drop table MY_TABLE 
go 

だから、私はこのようなあなたの文を記述します。

​​
0

たGOは、TSQLステートメントのバッチの終わりをマーク。 ALTER TABLEのようなDDL(データ定義言語)文とUPDATE TABLEのようなDML(データ操作言語)文を同じバッチで混在させることはできません。

各バッチは独自のものでコンパイルされています。したがって、ALTER TABLEステートメントとUPDATE TABLEステートメントが同じバッチにある場合、列modifiedDataが実際にまだ作成されていないため、SQL Serverは更新ステートメントをコンパイルできません。

+0

どのようにバッチのグループの周りに条件を置くのですか? – Rod

0

「無効な列..」エラーを回避したい場合は、動的SQLを使用する方法があります。例: :

create table dbo.t1 (id int primary key, cola varchar(20)) 
go 

insert dbo.t1 values (1, 'one') 
insert dbo.t1 values (2, 'two') 
go 

if not exists(select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 't1' and COLUMN_NAME = 'colb') 
BEGIN 
    -- add new column 'colb', and set its value initially to existing values in 'cola' 
    ALTER TABLE dbo.t1 ADD colb varchar(20) 

    DECLARE @v NVARCHAR(500) 
    SET @v = N'UPDATE dbo.t1 SET colb = cola' 
    EXEC (@v) -- use dynamic SQL, otherwise will get Invalid column name colb error.  
END 
GO 

動的SQLは最後の手段であることに注意してください。デビッド・ブラバントの答えはあなたの元々の問題のために行く方法のようです。

関連する問題