从 Alter Table 语句添加的更新字段

Icy*_*rts 2 sql-server t-sql sql-server-2008-r2

我正在尝试更新刚刚从ALter语句中添加的字段。我收到以下错误:

消息 207,级别 16,状态 1,过程 TestProc,第 436 行
无效的列名称“discountamount”。

这是我尝试使用的语法 - 更新刚刚添加到存储过程中的字段的正确方法是什么?

ALTER TABLE [dbo].msnbc
ADD saleamount float,
discountamount float;

UPDATE ftri
SET ftri.discountamount = fji.Totaldiscountamount
FROM [dbo].msnbc ftri
INNER JOIN [dbo].halfbaked fji
ON ftri.saleid = fji.saleid
Run Code Online (Sandbox Code Playgroud)

Eri*_*ing 5

如果需要在存储过程中执行此操作,则更新必须是动态的。

这是一个演示,以防您在途中迷路。

创建一个简单的表:

USE tempdb;

CREATE TABLE dbo.whatever
(
    Id INT
);

INSERT dbo.whatever ( Id )
VALUES ( 1 );

GO
Run Code Online (Sandbox Code Playgroud)

这是关于您的存储过程的外观:

CREATE PROC dbo.dosomething
(
    @i INT
)

AS
    BEGIN

        DECLARE @sql NVARCHAR(MAX) = N'';

        IF NOT EXISTS (   SELECT *
                          FROM   sys.columns AS c
                          WHERE  OBJECT_NAME(c.object_id) = 'whatever'
                                 AND c.name = 'something' )
            BEGIN
                ALTER TABLE dbo.whatever
                ADD something FLOAT;
            END;

        IF NOT EXISTS (   SELECT *
                          FROM   sys.columns AS c
                          WHERE  OBJECT_NAME(c.object_id) = 'whatever'
                                 AND c.name = 'soforth' )
            BEGIN
                ALTER TABLE dbo.whatever
                ADD soforth FLOAT;
            END;

        SELECT @sql = N'
        UPDATE dbo.whatever
        SET something = @s_i,
            soforth = @s_i
        WHERE Id = @s_i
        ';

        EXEC sys.sp_executesql @sql, N'@s_i INT', @s_i = @i;

    END;
Run Code Online (Sandbox Code Playgroud)

不会有任何错误,因为在此阶段未编译动态 SQL。

然后你可以运行它:

EXEC dbo.dosomething @i = 1;
Run Code Online (Sandbox Code Playgroud)

并验证结果:

SELECT *
FROM   dbo.whatever AS w;


+----+-----------+---------+
| Id | something | soforth |
+----+-----------+---------+
|  1 |         1 |       1 |
+----+-----------+---------+
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!