Рассмотрим этот запрос, который использует SELECT *
и «добавляет» вычисляемый столбец:
SELECT *,
IIF(TRUE, 1, 0) AS calculated_col
FROM Orders;
Я бы ожидал, что calculated_col
будет самым правым столбцом в наборе результатов.Однако на самом деле это самый левый столбец.Это самый правый вариант при выполнении эквивалентного запроса в SQL Server, например.
Теперь, поскольку это Access (ACE, Jet, что угодно), стандарты SQL не применяются, и в справке Access не будет указаноожидаемый результат, потому что это не достаточно подробно (вежливо).Поэтому у меня следующие вопросы:
Всегда ли Access вел себя таким образом или это «особенность» моей среды (ADO, поставщик OLE DB и т. Д.)?
Всегда ли Access вел себя таким образом вданная среда?(т.е. почему я не заметил этого раньше?)
PS Я знаю, конечно, что SELECT *
широко высмеивается и что, если порядок столбцов важен для меня, тогда я должен записать их все явно.Тем не менее, я был искренне удивлен фактическим поведением и заинтересован в любых ответах на мои вопросы.
Вот некоторые VBA для воспроизведения поведения: просто скопируйте + вставьте в любой модуль VBA, никаких ссылок не нужно устанавливатьи Access не нужно устанавливать, например, используйте редактор VBA в Excel:
Sub ColumnOrderWrong()
On Error Resume Next
Kill Environ$("temp") & "\DropMe.mdb"
On Error GoTo 0
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & _
Environ$("temp") & "\DropMe.mdb"
With .ActiveConnection
Dim Sql As String
Sql = _
"CREATE TABLE Orders" & vbCr & _
"(" & vbCr & " ID INTEGER, " & vbCr & _
" customer_id" & _
" INTEGER" & vbCr & _
");"
.Execute Sql
Sql = _
"INSERT INTO Orders (ID, customer_id) VALUES" & _
" (1, 2);"
.Execute Sql
Sql = _
"SELECT *, " & vbCr & _
" IIF(TRUE, 55, -99) AS calculated_col" & vbCr & _
" FROM Orders;"
Dim rs
Set rs = .Execute(Sql)
MsgBox _
"Fields(0).Name = " & rs.Fields(0).Name & vbCr & _
"Fields(1).Name = " & rs.Fields(1).Name & vbCr & _
"Fields(2).Name = " & rs.Fields(2).Name
End With
Set .ActiveConnection = Nothing
End With
End Sub