1

私はデータ移行を行っており、現在、最悪のシナリオに備えてリバース スクリプトを実装しています。私は今少し疲れているかもしれませんが、このことについて頭を悩ませることはできません - あなたが助けてくれるかもしれません.

私は次のSQLを持っています:

IF NOT EXISTS(SELECT * FROM sys.columns WHERE Name = N'FileId' AND Object_ID = Object_ID(N'[FileData]'))
AND EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'FileData' 
AND COLUMN_NAME = 'FileDataId')
BEGIN
    SELECT 1;
    --ALTER TABLE [FileData] ADD [FileId] [uniqueidentifier] NULL
    --ALTER TABLE [FileData] DROP CONSTRAINT PK_FileData

    --UPDATE [FileData] SET [FileData].[FileId] = [File].[FileId] 
    --FROM [FileData] INNER JOIN [File] on [FileData].FileDataId = [File].FileData

    --ALTER TABLE [FileData] ALTER COLUMN [FileId] [uniqueidentifier] NOT NULL
    --ALTER TABLE [FileData] ADD CONSTRAINT PK_FileData PRIMARY KEY (FileId)
END
ELSE
BEGIN
    SELECT 0;
END

FileName上記のクエリを実行すると、一貫して 0 が返されます。列は存在し、存在しないため、これは正しいFileDataIdことです。ここまでは順調ですね。

最初のステートメントを削除しselect、alter および update コードのコメントを外します。エラーが発生します:

無効な列名 'FileDataId'

コメント解除後に実行するクエリ

IF NOT EXISTS(SELECT * FROM sys.columns WHERE Name = N'FileId' AND Object_ID = Object_ID(N'[FileData]'))
AND EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'FileData' 
AND COLUMN_NAME = 'FileDataId')
BEGIN
    ALTER TABLE [FileData] ADD [FileId] [uniqueidentifier] NULL
    ALTER TABLE [FileData] DROP CONSTRAINT PK_FileData

    UPDATE [FileData] SET [FileData].[FileId] = [File].[FileId] 
    FROM [FileData] INNER JOIN [File] on [FileData].FileDataId = [File].FileData

    ALTER TABLE [FileData] ALTER COLUMN [FileId] [uniqueidentifier] NOT NULL
    ALTER TABLE [FileData] ADD CONSTRAINT PK_FileData PRIMARY KEY (FileId)
END
ELSE
BEGIN
    SELECT 0;
END

私の質問: IF ステートメントから
一貫して同じ結果が得られるのはなぜですか? -節のコードのコメントを外すと、突然入力されます。ここで何かが完全に欠けていますか?falsetrue

4

1 に答える 1

3

SQL Server は、バッチを実行する前にバッチ全体をコンパイルしようとします。列が存在しないためコンパイルに失敗し、ステートメントを実行するまでには至りません。IF

列の存在を確認するまで、列を参照するステートメントをコンパイルしようとしないように、動的 SQLを使用する必要があります。

IF NOT EXISTS(SELECT * FROM sys.columns WHERE Name = N'FileId' AND Object_ID = Object_ID(N'[FileData]'))
AND EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'FileData' 
AND COLUMN_NAME = 'FileDataId')
BEGIN
    EXEC('ALTER TABLE [FileData] ADD [FileId] [uniqueidentifier] NULL')
    EXEC('ALTER TABLE [FileData] DROP CONSTRAINT PK_FileData')

    EXEC('UPDATE [FileData] SET [FileData].[FileId] = [File].[FileId]
    FROM [FileData] INNER JOIN [File] on [FileData].FileDataId = [File].FileData')

    EXEC('ALTER TABLE [FileData] ALTER COLUMN [FileId] [uniqueidentifier] NOT NULL')
    EXEC('ALTER TABLE [FileData] ADD CONSTRAINT PK_FileData PRIMARY KEY (FileId)')
END
ELSE
BEGIN
    SELECT 0;
END
于 2013-09-06T12:12:30.853 に答える