Как заставить MS Access сохранить форматирование SQL?

У меня много SQL на работе в MS-Access, и мне нужно отформатировать его так, чтобы он был удобочитаемым. Проблема в том, что когда я переключаюсь между представлениями, я заканчиваю тем, что SQL сжимается во что-то, что я не могу прочитать.

Как заставить SQL сохранять свою «форму» при переходе к другим представлениям?


person Pureferret    schedule 13.08.2012    source источник


Ответы (4)


Я нашел хак, здесь. Секрет заключается в заключении вашего запроса в фиктивный запрос. Вот так:

SELECT * FROM (SELECT   <-----here
Table1.Field1,
Table1.Field2
FROM
Table1

WHERE
Table1.Field2 = "Yes") AS query1 <-----here

Я указал, где и как вы оборачиваете код. Единственная проблема, которую я вижу, заключается в том, что если вы хотите отредактировать код в представлении «Дизайн», то он, похоже, вообще не берет вложенный код.

person Pureferret    schedule 13.08.2012
comment
Это идея, построитель представления дизайна оптимизирует оператор SQL так, как он думает, лучше всего (на мой взгляд, нечасто), если вы умеете писать SQL вручную, тогда придерживайтесь этого, вам не нужно заключать ваш оператор как производную таблицу, однако, пока вы просматриваете только в режиме SQL и не переключаетесь в режим конструктора, он не изменит ваш оператор. - person Matt Donnan; 14.08.2012
comment
@MattDonnan, это правда, но я часто ловлю себя на том, что листаю туда-сюда. Теперь, если бы у меня был правильный интерфейс для написания sql... - person Pureferret; 14.08.2012
comment
Этот трюк работает хорошо, но кажется, что вы должны быть осторожны, сохраняя запрос только в режиме таблицы (Access 2010). Как ни странно, сохранение запроса в режиме SQL стирает все символы новой строки. Однако даже при сохранении в виде SQL этот хак по-прежнему предотвращает массовое переформатирование SQL, которое обычно происходит. - person Fred Schleifer; 08.07.2016

Иногда метод, предложенный @Pureferret, может дать сбой из-за того, что Access продолжает переформатировать SQL.

Я обнаружил, что единственный способ, который всегда работает, — это добавить блок UNION ALL в конец запроса.
Действительно, поскольку Access не обрабатывает UNION ALL, он даже не предлагает редактировать в режиме конструктора.
(Я пробовал с UNION, но получил Overflow ошибку!)

SELECT
    ...
    ...
FROM
    ...
WHERE
    ...
UNION ALL SELECT NULL, NULL, NULL FROM ANY_TABLE WHERE NULL

(если вас беспокоит нацеливание на реальную таблицу, вы можете использовать «двойную» таблицу для базы данных)

Более того, я нахожу немного "чище" добавлять только одну строку в конце.
Но вам нужно написать столько NULL, сколько выбранных полей в реальном запросе.

РЕДАКТИРОВАТЬ: /!\ Будьте осторожны с этим методом в подзапросах, так как он может вызвать некоторую ошибку Query too complex в запросах, использующих его! :(

person Pragmateek    schedule 17.10.2018

Если у вас есть доступ администратора к вашему ПК (требуется для установки), доступ к редактору SQL может быть правильным инструментом.
Я никогда не использовал его: как консультант я редко имею право устанавливать что-то на машины, которые использую, но он выглядит именно так, как я хотел бы иметь: реплика SSMS редактор.

person Patrick Honorez    schedule 20.11.2018

Это не сохранит форматирование, но может переформатировать.

Sub FormatSQL()
' self-contained FormatSQL()

' 1) Takes WHATEVER is in the clipboard:
' 2) replaces all comma + space with comma, vbCrLf and 5 spaces,
' 3) replaces ALL double-quotes chr(34) with single-quotes
' 4) puts result in clipboard

' CAUTION - This CAN screw up DOUBLED double-quotes (see below)

' Use to format SQL in MS Access SQL View
'
' Usage:
' 1) Copy source to clipboard (Ctrl-a, Ctrl-c)
' 2) Run this
' 3) Paste to target (Ctrl-v)
'
' Note: Does NOT have a "Done" popup.
'
' To add it Access ribbon, create a function that calls this and
' create a macro that calls the function using RunCode.
'
' Ex:
' Function FmtSQL()
'   Call FormatSQL()
' End Function

'NOTES: Must enable Forms Library: _
'   Tools > References > Microsoft Forms 2.0 Object Library
'or you will get a "Compile error: user-defined type not defined"

Dim indent As String
    indent = "," & vbCrLf & "     "

Dim DataObj As New MSForms.DataObject
DataObj.Clear   ' may prevent crashes

Dim clip As Variant
DataObj.GetFromClipboard
clip = DataObj.GetText

clip = Replace(clip, ", ", indent)

' Replace ALL double-quote with single-quote
' NOTE: This WILL screw up DOUBLED double-quotes, i.e.
' "Write ""My name is Paul."" "

clip = Replace(clip, Chr(34), "'")

DataObj.SetText clip
DataObj.PutInClipboard
Set DataObj = Nothing

' Sub FormatSQL()
End Sub
person RIck_R    schedule 29.06.2019
comment
Что оно делает? - person Pureferret; 29.06.2019
comment
Смотрите комментарии в функции. @Pureferret - person Andre; 29.06.2019
comment
@Андре я видел. Я надеялся, что ОП добавит несколько примеров в некодовую часть ответа. - person Pureferret; 29.06.2019
comment
Он не предназначен для вызова из программы. Примерами могут быть просто SQL, переформатированный Access, и тот же запрос с новыми строками и отступами в 5 пробелов. - person RIck_R; 30.06.2019
comment
Обратите внимание, что я немного изменил его, чтобы заменить ВСЕ двойные кавычки одинарными. Итак, что касается моего комментария от 30 июня, теперь это будет тот же запрос с символами новой строки и отступами в 5 пробелов, И двойные кавычки ЗАМЕНЯЮТСЯ на одинарные кавычки. - person RIck_R; 07.07.2019