ALTER 和 UPDATE 后无效的列名错误

Nis*_*sfa 7 sql-server

我正在尝试更新表中的特定列,但由于 SQL 编译时列名 IssueTimeUTC 实际上并不存在,因此出现错误。这是我的示例代码:

   WHILE  @startissuetime<='23:30'
        BEGIN
        ALTER TABLE Intraday_Forecast_temp
            ADD IssueTimeUTC SMALLDATETIME 

            UPDATE Intraday_Forecast_temp
            SET IssueTimeUTC=CAST(@tempdate AS SMALLDATETIME)
            WHERE DateTimeUTC>CAST(@tempdate AS SMALLDATETIME)

            UPDATE Intraday_Forecast_temp
            SET IssueTimeUTC=Dateadd(d,-1,CAST(@tempdate AS SMALLDATETIME))
            WHERE
Run Code Online (Sandbox Code Playgroud)

DateTimeUTC<=CAST(@tempdate AS S MALLDATETIME) END

我已经阅读了多个类似的帖子,但我无法做任何事情,因此我恳请您是否可以帮助我。

我得到的错误是这样的:

消息 207,级别 16,状态 1,第 56 行无效的列名称“IssueTimeUTC”。

更新:所以基本上我无法找到这个特定问题的确切解决方案,但我只是找到了一种“绕过”问题的方法。所以这是我使用的更新代码。

WHILE  @startissuetime<='23:30'
    BEGIN
        ALTER TABLE Intraday_Forecast_temp
        DROP COLUMN IssueTimeUTC 
        --------
        BULK INSERT..... 
        --------
        ALTER TABLE Intraday_Forecast_temp
        ADD IssueTimeUTC SMALLDATETIME 

        UPDATE Intraday_Forecast_temp
        SET IssueTimeUTC=CAST(@tempdate AS SMALLDATETIME)
        WHERE DateTimeUTC>CAST(@tempdate AS SMALLDATETIME)

        UPDATE Intraday_Forecast_temp
        SET IssueTimeUTC=Dateadd(d,-1,CAST(@tempdate AS SMALLDATETIME))
        WHERE DateTimeUTC<=CAST(@tempdate AS SMALLDATETIME)
    END
Run Code Online (Sandbox Code Playgroud)

我知道这可能不是最优雅的解决方案,但我最初用列 IssueTimeUTC 定义了 Intraday_Forecast_temp 表,然后我删除它并再次添加它。这样,SQL 不再抱怨编译时该列不存在:)

sep*_*pic 7

您不能添加该列并在同一批次中使用它。

因此,如果您执行代码,SSMS只需GO在您的命令之间添加,如下所示:

    ALTER TABLE Intraday_Forecast_temp
        ADD IssueTimeUTC SMALLDATETIME 

go ----------------------------<<<<<-----------------------------

        UPDATE Intraday_Forecast_temp
        SET IssueTimeUTC=CAST(@tempdate AS SMALLDATETIME)
        WHERE DateTimeUTC>CAST(@tempdate AS SMALLDATETIME)

        UPDATE Intraday_Forecast_temp
        SET IssueTimeUTC=Dateadd(d,-1,CAST(@tempdate AS SMALLDATETIME))
        WHERE DateTimeUTC<=CAST(@tempdate AS SMALLDATETIME)
Run Code Online (Sandbox Code Playgroud)

如果它是 的一部分stored procedure,请将您的包裹updateEXEC

exec ('UPDATE Intraday_Forecast_temp
        SET IssueTimeUTC=CAST(@tempdate AS SMALLDATETIME)
        WHERE DateTimeUTC>CAST(@tempdate AS SMALLDATETIME)')
Run Code Online (Sandbox Code Playgroud)

更新

在您的情况下,您可以以exec这种方式使用包装:

declare @tempdate date = getdate(); -- or whatever it should be
declare @sql nvarchar(4000)= N'UPDATE Intraday_Forecast_temp
        SET IssueTimeUTC=CAST(@tempdate AS SMALLDATETIME)
        WHERE DateTimeUTC>CAST(@tempdate AS SMALLDATETIME)';

exec sp_executesql @sql, N'@tempdate date', @tempdate = @tempdate;
Run Code Online (Sandbox Code Playgroud)