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)
如果需要在存储过程中执行此操作,则更新必须是动态的。
这是一个演示,以防您在途中迷路。
创建一个简单的表:
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)
希望这可以帮助!
归档时间: |
|
查看次数: |
85 次 |
最近记录: |