-
Коллеги! 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
делать умею.
-
where ? in (a,b)
> Вопрос именно про настройку символа ?. именованные, 2 с одним нельзя... не BDE, а и там это было что-то вроде багофичи.
-
> sniknik © (21.09.16 21:33) [1]
С where понятно, что можно. Вопрос был прямой - можно, как хочется, или нельзя)))
В принципе я уверен был, что процентов на 100 - нельзя. Я когда-то копал на эту тему. Не нашел. Но то было давно. Я еще новичок был. Сейчас покопал - тоже не нашел.
Надежда была на то, что я и сейчас новичок и поэтому не нашел))) Оказалось, правда нет. Печально. Буду выкручиваться.
-
хоть миллион раз
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
-
с одной стороны делфийское адо при присвоении значения параметру по имени берет только первое вхождение и игнорирует остальные. с другой стороны даже если не делфи, не виндовс и не адо, а линупс, freetds и php-pdo, то и там неуникальные именованные параметры в mssql не канают.
посему не надо мучить моск и выкручиваться и искать серебряную пулю.
серверная переменная и всё.
-
> что процентов на 100 - нельзя. при обращении по индексу можно, но смысл? все одно 2 раза присваивать, пусть и одному имени. как бы - "соблюдена буква но не дух".
-
теоретически, если перекрыть присвоение значения, и там делать перебор всех параметров сравнивая имя, то наверное сделать можно. ну это уже свой компонент будет... если получится. никогда не заморачивался этим, наверное потому что не с BDE начинал, а сразу с ADO.
-
> наверное потому что не с BDE начинал, а сразу с ADO.
BDE отродясь не пользовался. Знаю, что есть такая штука. Не более того. В общем, решил делать через переменные. declare @p int
set @p = ?
select ...
from...
where a=@p or b=@p Повторюсь, что была надежда, что можно как-то управлять подстановкой символов "?" в запросе. Все же, оказалось, что правило строгое - первый по порядку "?" соответствует первому параметру, второй - второму и т.д. И никак иначе.
-
то наверное сделать можно.
присвоение значений по имени всем одноименным параметрам сделать можно (как в бде), но только на мсскл это не будет работать на уровне сервера.
-
> но только на мсскл это не будет работать на уровне сервера. с чего это? мсскл на имена параметров как раз плюет, и может даже не знает о них, это в дельфе для удобства на них завязано, но индекс не забыт, а в мсскл по классике по индексу должно работать.
-
оке. если это адо виновато, тогда вопрос:
берем линупс, берем самую кошерную клиентскую либу mssql (freetds) для никсов и пробуем выполнить запрос с двумя параметрами с одинаковыми именами.
и оно не сработает. хотя там ады нету.
-
> если это адо виновато в чем? оно ничего не запрещает, а имена это больше дельфи чем ADO.
> берем самую кошерную клиентскую либу mssql (freetds) для никсов и пробуем выполнить запрос с двумя параметрами с одинаковыми именами. уверен, что она по индексу может?
лучше наоборот, берем ADO, запрос с двумя одноименные параметрами, задаем по индексу, выполняем - работает. ADODataSet1.CommandText:= 'SELECT :id, :id'; ADODataSet1.Parameters.Items[0].Value:= 98; ADODataSet1.Parameters.Items[1].Value:= 99; ADODataSet1.Open; и возвращает правильные значения (т.е. mssql точно сработал, раз выполнил и вернул).
-
Коллеги! Благодарю, что уделили внимание моему вопросу! Плюнул и сделал через переменные:
declare @p int
set @p = ?
select ...
from...
where a=@p or b=@p
|