2013-03-14 32 views
2

問題是我試圖插入一些數據到我的SQL服務器數據庫,但由於某種原因,我不斷收到臭名昭着的「無效列名」錯誤,並沒有插入作爲結果。SQL插入 - 消息207無效列名

現在,我相信我知道爲什麼(有點)這種情況正在發生,因爲我試圖插入一個值,該值基於使用案例查詢在另一列中的字段的值,但我不確定我真的這樣做 - 看看代碼:

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 - 不知道這是否有任何區別。

+0

哪裏'(點= 6)'和'(分= 12)'是從哪裏來的?你想參考什麼'點'?我不明白你在這裏做什麼。 – Taryn 2013-03-14 11:42:28

+0

對不起,我想我可能已經有點困惑了......我想要折扣價值爲0,0.5或1.0,具體取決於點數字段的價值,我不知道我做的是正確的事情與案例...... – ChocolateSheep 2013-03-14 11:47:47

+0

但在你的例子中,你插入的每一行的點值爲'3',所以沒有什麼會有'6'或'12'的'points'值。你正在嘗試更新嗎?也許你應該發佈你的表結構的一些示例數據,然後查詢你想要的結果。 – Taryn 2013-03-14 11:50:05

回答

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 
+1

這個作品,謝謝!我並沒有完全理解插入時select的用法,所以我想我需要對此進行一些研究:) – ChocolateSheep 2013-03-14 11:58:34

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