.net SQL Server:IF语句的结果不一致

.net SQL Server:IF语句的结果不一致,.net,sql,sql-server,.net,Sql,Sql Server,我正在进行数据迁移,目前正在为最坏情况实施一个反向脚本。我现在可能有点累了,但我不能集中精力在这件事上,所以也许你能帮我 我有以下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 = 'Fil

我正在进行数据迁移,目前正在为最坏情况实施一个反向脚本。我现在可能有点累了,但我不能集中精力在这件事上,所以也许你能帮我

我有以下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
运行上述查询将始终返回一个0-这是正确的,因为
FileName
列确实存在,而
FileDataId
不存在。到目前为止还不错

当我删除第一个
语句时,选择
语句并取消对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语句中得到相同的
false
结果,但是当我在
true
-子句中取消注释代码时,它突然被输入。我是否完全遗漏了什么?

SQL Server希望在执行前编译整个批处理。它无法编译它,因为该列不存在,因此它永远不会执行
IF
语句

必须使用,以便在验证列的存在之前,它不会尝试编译引用该列的语句

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

当然,更新状态才是问题所在。我完全忘了我有那份声明。这也是我需要在子作用域中执行的唯一语句,例如:EXEC('UPDATE[FileData]SET[FileData].[FileId]=[File].[FileId]FROM[FileData]internal JOIN[File]on[FileData].FileDataId=[File].FileData')非常感谢!