Конференция "Базы" » MSSQL+ADODB: Использовать один параметр несколько раз [MSSQL]
 
  • Тимохов Дима © (21.09.16 20:22) [0]
    Коллеги!

    1. Есть запрос, в котором один параметр используется 2 раза.

    Например (из головы):

    select ...
    from...
    where a=? or b=?



    Здесь ? - один и тот же параметр.
    Приходится задавать два идентичных по значению объекта ADODB.Parameter.

    2. Вопрос. Если средство указать, что два ? соответствуют одному параметру?

    Например, как с функцией Format в Delphi: можно писать %0:s несколько раз - значит, что соответствует первому по порядку аргументу.

    PS. Про то, как выкрутиться через переменную, я знаю. Вопрос именно про настройку символа ?.
    Т.е. так

    declare @p int
    set @p = ?
    select ...
    from...
    where a=@p or b=@p


    делать умею.
  • sniknik © (21.09.16 21:33) [1]
    where ? in (a,b)

    > Вопрос именно про настройку символа ?.
    именованные, 2 с одним нельзя... не BDE, а и там это было что-то вроде багофичи.
  • Тимохов Дима © (21.09.16 22:05) [2]

    > sniknik ©   (21.09.16 21:33) [1]

    С where понятно, что можно.
    Вопрос был прямой - можно, как хочется, или нельзя)))

    В принципе я уверен был, что процентов на 100 - нельзя.
    Я когда-то копал на эту тему. Не нашел. Но то было давно. Я еще новичок был.
    Сейчас покопал - тоже не нашел.

    Надежда была на то, что я и сейчас новичок и поэтому не нашел)))
    Оказалось, правда нет. Печально. Буду выкручиваться.
  • iop © (21.09.16 22:34) [3]
    хоть миллион раз

    declare @p_par int;
    set @p_par = :single_param;

    select ....
    from ....
    where f1 = @p_par
     or f2 = @p_par
     or whateverelse = @p_par
     -----
     or anything = @p_par
  • iop © (21.09.16 22:42) [4]
    с одной стороны делфийское адо при присвоении значения параметру по имени берет только первое вхождение и игнорирует остальные.
    с другой стороны
    даже если не делфи, не виндовс и не адо,
    а линупс, freetds и php-pdo,
    то и там неуникальные именованные параметры в mssql не канают.

    посему не надо мучить моск и выкручиваться и искать серебряную пулю.

    серверная переменная и всё.
  • sniknik © (22.09.16 00:28) [5]
    > что процентов на 100 - нельзя.
    при обращении по индексу можно, но смысл? все одно 2 раза присваивать, пусть и одному имени. как бы - "соблюдена буква но не дух".
  • sniknik © (22.09.16 00:33) [6]
    теоретически, если перекрыть присвоение значения, и там делать перебор всех параметров сравнивая имя, то наверное сделать можно. ну это уже свой компонент будет... если получится. никогда не заморачивался этим, наверное потому что не с BDE начинал, а сразу с ADO.
  • Тимохов Дима © (22.09.16 00:37) [7]

    > наверное потому что не с BDE начинал, а сразу с ADO.

    BDE отродясь не пользовался. Знаю, что есть такая штука. Не более того.
    В общем, решил делать через переменные.
    declare @p int
    set @p = ?
    select ...
    from...
    where a=@p or b=@p


    Повторюсь, что была надежда, что можно как-то управлять подстановкой символов "?" в запросе. Все же, оказалось, что правило строгое - первый по порядку "?" соответствует первому параметру, второй - второму и т.д. И никак иначе.
  • iop © (22.09.16 00:42) [8]
    то наверное сделать можно.

    присвоение значений по имени всем одноименным параметрам сделать можно (как в бде),
    но только на мсскл это не будет работать на уровне сервера.
  • sniknik © (22.09.16 08:05) [9]
    > но только на мсскл это не будет работать на уровне сервера.
    с чего это? мсскл на имена параметров как раз плюет, и может даже не знает о них, это в дельфе для удобства на них завязано, но индекс не забыт, а в мсскл по классике по индексу должно работать.
  • iop © (22.09.16 08:30) [10]
    оке.
    если это адо виновато, тогда вопрос:

    берем линупс, берем самую кошерную клиентскую либу mssql (freetds) для никсов и пробуем выполнить запрос с двумя параметрами с одинаковыми именами.

    и оно не сработает. хотя там ады нету.
  • sniknik © (22.09.16 13:12) [11]
    > если это адо виновато
    в чем? оно ничего не запрещает, а имена это больше дельфи чем ADO.

    > берем самую кошерную клиентскую либу mssql (freetds) для никсов и пробуем выполнить запрос с двумя параметрами с одинаковыми именами.
    уверен, что она по индексу может?

    лучше наоборот, берем ADO, запрос с двумя одноименные параметрами, задаем по индексу, выполняем - работает.
    ADODataSet1.CommandText:= 'SELECT :id, :id';
    ADODataSet1.Parameters.Items[0].Value:= 98;
    ADODataSet1.Parameters.Items[1].Value:= 99;
    ADODataSet1.Open;
    и возвращает правильные значения (т.е. mssql точно сработал, раз выполнил и вернул).
  • Тимохов Дима © (24.09.16 01:05) [12]
    Коллеги!

    Благодарю, что уделили внимание моему вопросу!

    Плюнул и сделал через переменные:

    declare @p int
    set @p = ?
    select ...
    from...
    where a=@p or b=@p

 
Конференция "Базы" » MSSQL+ADODB: Использовать один параметр несколько раз [MSSQL]
Есть новые Нет новых   [118595   +8][b:0][p:0.001]