記得初中時(shí)住校吃飯?zhí)茫菚r(shí)候每周伙食費(fèi)是20元。早上1元,午餐晚餐各1.5元(周末則回家)。 早餐一般是一碗很稀的粥,上面漂浮著一塊或者兩塊油汪汪的肥肉,外加一個(gè)包子。星期三則是豬骨頭湯米粉,——當(dāng)然是沒(méi)有包子了,——所以,早操一結(jié)束,大家就集體逃亡一般奔向飯?zhí)。最開(kāi)始沖過(guò)去的在每個(gè)窗口前排成兩列,排到十幾個(gè)之后,后面的大都是女生。其它男同學(xué)則會(huì)繞到側(cè)面,伺機(jī)斜插進(jìn)去。 曾經(jīng)有個(gè)走讀的同學(xué)問(wèn)我,住校時(shí)排隊(duì)很長(zhǎng)嗎?我認(rèn)真地想了想,“排隊(duì)不長(zhǎng),只是很粗”。她笑了,“你很幽默!比缓笪乙残α,雖然我并不是一個(gè)幽默的人。直到后來(lái)學(xué)生會(huì)組織了一些學(xué)生干部專(zhuān)門(mén)去維持秩序,才開(kāi)始“化寬為長(zhǎng)”。
正如太寬的隊(duì)伍常常有不遵守秩序的嫌疑,太寬的數(shù)據(jù)表也常常有不遵守第二范式的嫌疑。而違反它,在數(shù)據(jù)庫(kù)中往往會(huì)引發(fā)很多問(wèn)題,表維護(hù)不方便,難以統(tǒng)計(jì)分析,查詢(xún)不好處理等等……所以“化寬為長(zhǎng)”就變得很重要了。 化寬為長(zhǎng)的前提是要求“寬”的那部分擁有共同的屬性,就像寬的那部分隊(duì)伍一樣(都是男同學(xué),都在隊(duì)伍側(cè)面),例如,都是數(shù)值型,都在最右邊的字段等等。如果沒(méi)有這些,當(dāng)然談不上化寬為長(zhǎng)了。先看看效果吧: 代碼如下,具體見(jiàn)示例文件。喜歡的話,就回個(gè)帖吧。 - Function getSQL(ByVal strTableName As String, ByVal strEndFieldName As String) As String
- Dim rst As New ADODB.Recordset
- Dim i As Long
- Dim lngPosition As Long
- Dim strSQL As String, strSQL2 As String
- Dim dic As New Dictionary
- Dim lngEnd As Long
-
- rst.Open strTableName, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
- '查找字段分割點(diǎn)的位置
- For i = 0 To rst.Fields.Count - 1
- If rst.Fields(i).Name = strEndFieldName Then
- lngEnd = i
- Exit For
- End If
- Next
- '切割字段
- For i = 0 To rst.Fields.Count - 1
- '在分割點(diǎn)之前,直接連接字符串
- If i <= lngEnd Then
- strSQL = strSQL & rst.Fields(i).Name & ","
- Else
- '在分割點(diǎn)之后,寫(xiě)入字典,用于確定變量名和變量值。
- dic.Add i, rst.Fields(i).Name
-
- End If
- Next
- '關(guān)閉記錄集
- rst.Close
-
- '準(zhǔn)備語(yǔ)句
- For i = 0 To dic.Count - 1
- strSQL2 = strSQL2 & "select " & strSQL & """" & _
- dic.Items(i) & """ as 變量名稱(chēng),[" & _
- dic.Items(i) & "] as 變量值 from " & strTableName & " union all "
- Next
-
- getSQL = Left(strSQL2, Len(strSQL2) - 11)
-
- End Function
復(fù)制代碼
|