2

问题是我试图将一些数据插入到我的 SQL 服务器数据库中,但由于某种原因,我不断收到臭名昭著的“无效列名”错误,结果没有插入任何内容。

现在,我相信我知道为什么(有点)会发生这种情况,因为我正在尝试使用案例查询插入一个基于另一列中的字段值的值,但我不确定我真的这样做是正确的 - 请参阅代码:

INSERT INTO dbo.table_name(points, discount)
VALUES
(3, CASE WHEN (points = 6) THEN 0.5 WHEN (points = 12) THEN 1.0 ELSE 0 END

我在“点”列上得到无效的列名。它肯定存在,所以我认为我的查询不正确,或者我应该以不同的方式解决这个问题是否正确?

我正在使用 SQL Server 2008 R2 - 不确定这是否有任何区别。

4

2 回答 2

2

VALUES 部分中的数字 3 尚未成为“点”列,因此您不能在 CASE 语句中像这样引用它。您可以将查询重写为类似的内容:

INSERT INTO dbo.table_name(points, discount)
select 
    x.points
    ,CASE WHEN (x.points = 6) THEN 0.5 WHEN (x.points = 12) THEN 1.0 ELSE 0 END as discount
from (
    select 3 as points union all
    select 12
) x
于 2013-03-14T11:48:13.033 回答
1

您是否希望能够以某种方式强制执行此业务逻辑?如果是这样,那么在我看来,您可能正在寻找计算列。

CREATE TABLE table_name
( 
    ID INT,
    Points INT,
    Discount AS CASE WHEN (Points = 6) THEN 0.5 WHEN (Points = 12) THEN 1.0 ELSE 0 END
)

这样,您插入表中的任何数据都将始终符合这些规则。

插入现在变得非常简单:

INSERT INTO table_name (Points) VALUES(6);
INSERT INTO table_name (Points) VALUES(5);
INSERT INTO table_name (Points) VALUES(12);
于 2013-03-15T09:21:49.423 回答