Как построить правильное выражение оператора SQL Access LIKE? - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь выполнить поиск пользователя по таблице в Microsoft Access 2010, но команда SQL не работает. Команда, которая загружает и обновляет таблицу, выглядит так:

SELECT Equipment.equipmentID, Equipment.equipmentName, Equipment.model, 
Equipment.make, Equipment.equipmentLocation FROM Equipment ORDER BY Equipment.equipmentName; 

Это работает, но когда я пытаюсь использовать переменную (или любые другие нормальные критерии):

searchItem = Me.searchBox.Value
Me.List64.RowSource = "SELECT Equipment.equipmentID, Equipment.equipmentName,
Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment 
WHERE Equipment.equipmentName LIKE '%searchItem%' ORDER BY Equipment.equipmentName;"

Я также пробовал что-то вроде "% 10%" вместо переменной searchItem, но команда выдает таблицу пустой, без ошибок. Я подозреваю, что проблема в названии столбца Equipment.eqiupmentName, но я не могу понять, что здесь не так.

Вот краткий обзор того, как выглядит таблица:

test

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Попробуйте это:

Me.List64.RowSource = & _
    "SELECT Equipment.equipmentID, Equipment.equipmentName," & _
        " Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment" & _
    " WHERE Equipment.equipmentName LIKE '*" & searchItem & "*'" & _
    " ORDER BY Equipment.equipmentName;"
  • Пользователь rjt011000 имеет правильное решение, но я рекомендую использовать & для объединения строк в VBA (и Access),Для объяснения + и & см. этот поток .

  • Access не будет распознавать или заменять переменные VBA внутри оператора SQL.Кроме того, в этом случае оператору LIKE передается строковое значение SQL (внутри одинарных кавычек ... которые находятся внутри двойных кавычек), поэтому, даже если на переменную VBA можно ссылаться непосредственно внутри SQL, Access не интерпретирует ничего подобного внутристроковое значение.

  • В операторе Access SQL LIKE шаблон сопоставления многосимвольных символов равен *, а не %.Access также распознает оператора ALIKE, который действительно соблюдает шаблон ANSI %.См. LIKE оператор документы и эту тему относительно ALIKE .

    • Если быть более точным, разделители строк и символ сопоставления с шаблоном LIKE должны быть экранированы, если вы не хотите, чтобы пользователь случайно вводил недопустимые символы, которые вызывают ошибки в SQL.Ниже приведен пример побега нескольких из них.Есть более изящные способы справиться с этим для всех специальных символов, но код и методика выходят за рамки этого ответа.
 ...'" & Replace(Replace(searchItem, "*", "[*]"), "'", "''") & "'...
  • Для записи, хотя Access SQL не будет заменять переменную VBA, он будет распознавать и вызывать общедоступную функцию VBA.Обычно такая общедоступная функция должна быть определена в обычном модуле, но в контексте запроса источника записи формы иногда может вызываться метод модуля формы.

  • Последний метод .... Можно ссылаться на значение элемента управления формы непосредственно в SQL.Это может быть очень удобно и сокращать лишний код, но есть пара предостережений:

    • Форма, конечно, должна быть открыта, в противном случае Access интерпретирует ссылку как неизвестный параметр и отобразит подсказку.Это, конечно, не будет проблемой, если SQL всегда находится в контексте одной и той же формы.
    • Иногда доступ автоматически обновляет запрос при изменении такого ссылочного элемента управления, но это не всегда гарантируется.«Время» автоматического обновления может быть не интуитивно понятным.Вы можете вызвать метод Refresh для элемента управления или подчиненной формы из различных событий формы, чтобы принудительно обновить запрос после изменения значения.
    • Обратите внимание, что в следующем примере конкатенация строк находится внутри строки VBA., так что конкатенация действительно происходит в контексте SQL, а не заранее, как в первом фрагменте кода.В этом нет проблемы, просто что-то нужно учесть, поскольку весь этот ответ вращается вокруг правильной интерпретации и объединения строк.
      • Но на самом деле та же проблема существует для неэкранированных символов сопоставления с образцом в тексте пользователя.Вместо того, чтобы делать текст SQL длинным и безобразным с помощью вызовов Replace (), вместо этого создайте пользовательскую функцию (например, EscapePattern()), которая делает это для любого текста, а затем оберните ссылку на элемент управления этой функцией.Пример делает это, хотя я не включаю код для специальной функции.Такая функция может также использоваться в первом фрагменте кода VBA для упрощения построения текста SQL.
Me.List64.RowSource = & _
  "SELECT Equipment.equipmentID, Equipment.equipmentName," & _
      " Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment" & _
  " WHERE Equipment.equipmentName LIKE ('*' & EscapePattern(Forms![Form Name]![Control Name]) & '*')" & _
  " ORDER BY Equipment.equipmentName;"
  • Всегда естьБольше!Вы видели продолжение линии VBA в моем примере?Это значительно упрощает просмотр текста SQL в редакторе VBA.
0 голосов
/ 17 ноября 2018

Я подозреваю, что вы неправильно устанавливаете переменную searchItem в строке SQL. Я не слишком знаком с конкатенацией строк доступа, но попробуйте отделить searchItem от строки SQL и затем проверить, имеет ли ваш RowSource значение, которое вы подозреваете.

Me.List64.RowSource = "SELECT Equipment.equipmentID, Equipment.equipmentName,
Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment 
WHERE Equipment.equipmentName LIKE '%" + searchItem + "%' ORDER BY Equipment.equipmentName;"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...