Параметры в Sql-запросе

отредактировано November 2008 Раздел: FastReport 4.0
написал:
SELECT LEAST(outdate, '2008/09/30') - GREATEST(indate, '2008/09/1') + 1
FROM sometable
WHERE '2008/09/01' <= outdate AND indate <= '2008/09/30'
Реальный запрос несколько сложней, но суть в том, что как записано выполняется и возвращает верный результат. Но если вместо констант использовать параметры, не всё гладко.
Параметры Date1 и Date2 берутся из формы отчёта.

Вот так без ошибок:
написал:
SELECT LEAST(outdate, '2008/09/30') - GREATEST(indate, '2008/09/1') + 1
FROM sometable
WHERE :Date1 <= outdate AND indate <= :Date2
А вот так:
написал:
SELECT LEAST(outdate, :Date2) - GREATEST(indate, :Date1) + 1
FROM sometable
WHERE :Date1 <= outdate AND indate <= :Date2
CommandText does not return a result set.

Понятно, что дело в запросе. Но не пойму в чём дело. Как правильно запрос написать?
Кратко поясню. Человек проживал с indate по outdate. Необходимо получить количество дней его проживания с :Date1 по :Date2.

Комментарии

  • FokewolfFokewolf Киев
    отредактировано 16:01
    AlexCoRu написал: »
    Реальный запрос несколько сложней, но суть в том, что как записано выполняется и возвращает верный результат. Но если вместо констант использовать параметры, не всё гладко.
    Параметры Date1 и Date2 берутся из формы отчёта.

    Вот так без ошибок:

    А вот так:
    SELECT LEAST(outdate, :Date2) - GREATEST(indate, :Date1) + 1
    FROM sometable
    WHERE :Date1 <= outdate AND indate <= :Date2
    
    CommandText does not return a result set.

    Понятно, что дело в запросе. Но не пойму в чём дело. Как правильно запрос написать?
    Кратко поясню. Человек проживал с indate по outdate. Необходимо получить количество дней его проживания с :Date1 по :Date2.
    А так ? :
    SELECT LEAST(outdate, :Date2) - GREATEST(indate, :Date1) + 1
    FROM sometable
    WHERE :Date3 <= outdate AND indate <= :Date4
    
  • отредактировано November 2008
    Fokewolf написал: »
    А так ?
    Нет так тоже не проходит. И вообще не получится как я хочу.
    Оказывается
    Fokewolf написал: »
    Согласно спецификации языка SQL маркеры параметров нельзя размещать в следующих местах SQL-оператора:
    - в списке полей оператора SELECT;
    - одновременно как оба операнда для бинарного оператора (например, оператора =), так как на этапе компиляции нельзя определить тип операндов, выступающих в роли параметров;
    - одновременно как первый и второй операнд для оператора BETWEEN;
    - одновременно как первый и третий операнд для оператора BETWEEN;
    - одновременно как первый операнд и второй операнд для оператора IN;
    - как операнд унарного оператора + или -.
    Придётся, видимо, либо в программе формировать запрос, либо средствами построителя отчёта. У меня в реальном запросе нужна группировка:
    SUM( LEAST(outdate, :Date2) - GREATEST(indate, :Date1) + 1 )
    Хотя, наверно, можно использовать скрипт для формирования запроса? Непонятно только в каком месте, т.е. при каком событии.
  • отредактировано April 2010
    Ещё возник вопрос.
    Как передать параметр-список в sql-запрос в оператор IN?
    Грубо, запрос выглядит так:
    SELECT * FROM table WHERE field IN (1, 2, 7, 12)
    Хочу в отчёте создать диалог с чекбоксами, пользователь отмечает некоторые из них и как передать его выбор в запрос
    SELECT * FROM table WHERE field IN (:List)
    Что должна представлять переменная List? Массив? Никак не соображу.
  • Stalker4Stalker4 123
    отредактировано 16:01
    AlexCoRu написал: »
    Ещё возник вопрос.
    Как передать параметр-список в sql-запрос в оператор IN?
    Грубо, запрос выглядит так:
    SELECT * FROM table WHERE field IN (1, 2, 7, 12)
    Хочу в отчёте создать диалог с чекбоксами, пользователь отмечает некоторые из них и как передать его выбор в запрос
    SELECT * FROM table WHERE field IN (:List)
    Что должна представлять переменная List? Массив? Никак не соображу.
    Передать как параметр список в sql-запрос напрямую не получиться.

    Варианта тут два:
    1) Генерировать запрос динамически в коде скрипта
    2) Использовать Query которые поддерживают макросы. Например в библиотеке SQL Direct есть компонент TSDMacroQuery, который их поддерживает. Аналогичный компонент есть и в RxLib для BDE.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.