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計算的值,我不明白爲什麼它會拋出映射到表定義,並且它使代碼混淆,因爲它看起來就像你給這個領域一個空值,當這不是發生了什麼。
有人知道這種奇特行爲的原因嗎?
大多數人認爲忽略列表作爲*壞習慣*。你已經知道一個解決方案 - 你爲什麼如此確定,而不是包含一個列列表? –
不要不同意,但它是允許的,並且當您繼承遺留代碼時,您無法修復所有不良習慣。國際海事組織,最好在重構之外儘可能少地觸及它。 – hsoj
插入一個不存在的列表是* minimal *,因爲該代碼已經是* fragile *。留下地雷等待後來爲別人炸燬的是*,在我看來*是不負責任的。 –