2017-08-24 64 views
2

正在考慮將項目列添加到一堆表中。似乎不會有什麼大不了的,因爲SQL Server會分配值,所以我們不需要修改現有的存儲過程,其中有很多。雖然不那麼容易,因爲INSERT需要一個列列表或一個空值。所以如果一個rowversion列被添加到一個表中,任何沒有列列表的存儲過程將會失敗。如果未提供列列表,則在RowVersion列的表上執行INSERT操作時需要空值。爲什麼?

下面是示例代碼進行一些修改微軟的文檔,以顯示我的意思:

CREATE TABLE MyTest 
(
    myKey int PRIMARY KEY, 
    myValue int, 
    RV rowversion 
); 
GO 

--Works fine 
INSERT INTO MyTest (myKey, myValue) VALUES (1, 0); 
GO 

--Fails with error: Column name or number of supplied values does not match 
--table definition 
INSERT INTO MyTest VALUES (2, 0); 

--Works fine. Weird 
INSERT INTO MyTest VALUES (2, 0, NULL); 
GO 

我不明白爲什麼它需要一個NULL值,如果未提供列列表。由於SQL Server計算的值,我不明白爲什麼它會拋出映射到表定義,並且它使代碼混淆,因爲它看起來就像你給這個領域一個空值,當這不是發生了什麼。

有人知道這種奇特行爲的原因嗎?

+1

大多數人認爲忽略列表作爲*壞習慣*。你已經知道一個解決方案 - 你爲什麼如此確定,而不是包含一個列列表? –

+0

不要不同意,但它是允許的,並且當您繼承遺留代碼時,您無法修復所有不良習慣。國際海事組織,最好在重構之外儘可能少地觸及它。 – hsoj

+0

插入一個不存在的列表是* minimal *,因爲該代碼已經是* fragile *。留下地雷等待後來爲別人炸燬的是*,在我看來*是不負責任的。 –

回答

0

當您提供所有值時,列順序只是預定義的。否則,您也可以按錯誤的順序提供參數。所以如果你想要跳過參數,你必須提供一個列表,給出一個提示,如何解釋這些值,還有一個計算值是否涉及。