2016-12-05 2 views
0

У меня есть одна таблица в таблице Excel с примерно 20 столбцами, и я написал SQL-запрос в EXCEL, используя ADO, чтобы получить результирующий набор, которым я пользуюсь.Доступ SQL, выполненный через excel, возвращает пустой набор результатов

Я самостоятельно присоединиться к столу, как это:

strSQL = "SELECT C1.[Column1], C1.[Column2], C2.[Column 1], C2.[Column 2] FROM [Data 1$] C1 " & _ 
     "INNER JOIN [Data 1$] C2 on C1.[Column 3] = C2.[Column 3] " & _ 
     "AND C1.[Column 1] = C2.[Column 1] " & _ 
     "AND C1.[Column 2] = C2.[Column 2] " & _ 
     "AND (C1.[Column 4] = RIGHT(C2.[Column 5], LEN(C2.[Column 5])-1) " & _ 
     "OR C2.[Column 4] = RIGHT(C1.[Column 5], LEN(C1.[Column 5])-1)) " & _ 
     "AND C1.[Column 6] < C2.[Column 6]" 

Однако результат является пустым множеством. Я просверлил вниз к следующей строке

"AND (C1.[Column 4] = RIGHT(C2.[Column 5], LEN(C2.[Column 5])-1) " & _ 
"OR C2.[Column 4] = RIGHT(C1.[Column 5], LEN(C1.[Column 5])-1)) " 

Если я удалить его я получаю 5 результатов, 3 каждого удовлетворяют эти критерии !!

Как вы думаете, вы можете помочь мне выяснить, что происходит?

Thanks,

+2

Убедитесь, что вы одинарные кавычки любые строки значений в предложении WHERE. Вы должны отредактировать свой вопрос и показать нам вывод «Debug».Печать strSQL' –

+0

Добро пожаловать в переполнение стека! См. [Как заполнить минимальный, полный и проверенный пример] (/ help/mcve). –

+0

Спасибо, ребята. Вот вывод Debug Print: 'code'SELECT C1. [Столбец 1], C1. [Столбец 2], C2. [Столбец 2], C2. [Столбец 3] FROM [Рабочий лист 1 $] C1 INNER JOIN [Рабочий лист 1 $] C2 на C1. [Столбец 4] = C2. [Столбец 4] И C1. [Столбец 1] = C2. [Столбец 1] И (C1. [Столбец 5] = ВПРАВО (C2. [Столбец 6], LEN (C2. [Столбец 6]) - 1) ИЛИ C2. [Столбец 5] = ВПРАВО (C1. [Столбец 6], LEN (C1. [Столбец 6]) - 1)) И C1. [Столбец 2]

ответ

0

+1 на @Alex K. сказал. Тем не менее, я не вижу таких вещей, как WHERE c1.[Column1] = 'Henry' в вашем SQL, поэтому я полагаю, что это не настоящая ошибка здесь.

Кроме того, вы можете проверить следующее:

  1. В своем коде я вижу имена столбцов, написанных как [Column 2] и как [Column2] (с + без пробелов). Вы не указали ошибку (которая обычно указала бы, что параметр отсутствует), поэтому я предполагаю, что опечатки находятся только в вашем сообщении, но не вредят двойной проверке.

  2. У вас есть подстрочные проверки в вашем WHERE -claus с Right(...) и т. Д. Есть ли у вас шансы на то, что у вас есть зацепки?

  3. Исключить форматирование столбцов в виде цифр или текста. Затем, как и упомянутый @Alex K., заключите строковые фильтры в одинарные кавычки '. Этот get немного грязный, если он сопряжен с VBA-переменными, но это, похоже, не проблема.

  4. Отформатировав свои столбцы, убедитесь, что соответствующие столбцы в C1 и C2 имеют тот же тип. Опять же, обычно вы получите сообщение об ошибке, например, «Datafield имеет неправильный тип данных» - все равно никакого вреда при проверке.

В целом: так как вы пишете SQL в Excel-VBA, вы могли бы рассмотреть возможность написания SQL-кода в пустой первенствовать-листа, а затем прочитать его в аа переменную VBA-строку типа так:

Очевидным недостатком является то, что вы не можете использовать VBA-Variables. Тем не менее,

  • доступности/читаемость гораздо лучше
  • вам не нужно беспокоиться о побеге двойных кавычек "
  • нет макс. количество строк кода (25 в VBA-коде)

надежда, что помогает

Смежные вопросы