【问题标题】:SQL Insert - Msg 207 Invalid column nameSQL 插入 - 消息 207 列名无效
【发布时间】:2013-03-14 11:39:55
【问题描述】:

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

现在,我相信我知道为什么(某种程度上)会发生这种情况,因为我正在尝试使用案例查询插入一个基于另一列中的字段值的值,但我不确定我是否'我真的做对了 - 查看代码:

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

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

我使用的是 SQL Server 2008 R2 - 不确定这是否有什么不同。

【问题讨论】:

  • (points = 6)(points = 12) 来自哪里?你想引用什么points?我不明白你想在这里做什么。
  • 对不起,我想我可能有点混淆了...我希望折扣值是 0、0.5 或 1.0,具体取决于点字段的值,我再次不确定我正在做正确的事情......
  • 但是在您的示例中,您插入的每一行的点值都为3,因此不会有points612。您是否尝试进行更新?也许您应该发布您的表结构一些示例数据,然后发布您想要的查询结果。
  • 哦,我明白了,不,这只是我作为示例发布的一行,在此之后还有其他几行具有不同的点值(即 5、6、12 等)。
  • 请用一些示例数据和所需的结果编辑您的原始帖子,这将有助于解决您的问题。 :)

标签: sql-server sql-server-2008-r2 sql-insert


【解决方案1】:

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

【讨论】:

  • 这行得通,谢谢!插入时我没有完全理解 select 的使用,所以我想我需要对此做一些研究:)
【解决方案2】:

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

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-13
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多