以下情景:您在C#中有幾個與SQL Server中的Enum-ish表綁定(實際上由其生成)的標誌枚舉。假設您是分銷商,並且您允許您的分銷商指定他們運送到的美國州。作爲一個輝煌和優雅的軟件工程師,你實施這些爲按位組合的標誌值,以節省存儲:使用64位有符號值在SQL和C#中模擬128位無符號整數?
create table USState (
StateID bigint, StateAbbr char(2), StateName varchar(50))
/* insert all US States + DC into USState, StateIDs must be in powers of two */
/* StateID 0 reserved for 'None': */
create procedure GetStatesByFlag (@StateFlags bigint) as
declare @StateIDs table
(
StateID bigint,
primary key (StateID)
)
insert into @StateIDs
select StateID
from USState
where @StateFlags & StateID != 0
or (@StateFlags = 0 and StateID = 0)
select s.StateID, s.StateAbbr, s.StateName
from
USState s join
@StateIDs si
on si.StateID = s.StateID
甜。您可以使用按位邏輯在SQL和C#中動態地包含/排除,這使您可以即時保存複選框列表並在Asp.NET中選擇列表,同時仍然只存儲一個64位數字以保存任意組合選項。在你的過程的WHERE子句中,你不需要一個不可索引的比較運算符,除了最大爲64行的枚舉表本身。在印第安納州和加利福尼亞州發貨的每個人都可以使用平等比較和索引來搜索您的分銷商。
現在你有一個要求增加對美國領土,軍隊郵政編碼和加拿大省份的支持,並且以向後兼容的方式這樣做。有沒有削減名單到< 64項,而業務真的希望避免必須從其他領土和部門隔離舊校區國家。
你是做什麼的?
創造性的答案是讚賞,但真正的挑戰是這樣的:有沒有辦法強制相同的按位數學運算在無符號64位值工作在簽名的同時使用負空間超過64位可能的位,在C#和SQL(2008)?如果它很重要,則標誌被模擬,而不是「真正的」標誌,所以在技術上不需要使用[Flags]屬性來處理CLR枚舉。
組合是的,但在這種情況下,組合就像向印第安那州和加利福尼亞州運送,而不是一個州。無論如何,也許你可以嘗試使用GUID?它們實際上是128位整數。 – kubal5003 2009-11-14 00:46:17
負性空間只是64位中的一個,所以沒有。 – Joe 2009-11-14 01:45:48
我遇到了完全相同的問題。你如何使用GUID來存儲數字? – arao6 2014-10-28 02:55:48