Конференция "Базы" » Динамическое формирование списка значений для выборки [D5, MSSQL]
 
  • harisma (28.02.08 16:10) [0]
    Необходимо написать простой запрос (являющийся частью другого скрипта), возвращающий некоторый набор данных. Ну, что-то вроде такого:


    select <somefields> from <sometable>
    where recid in (<values set>).



    Проблема в том, что этот <values set> должен формироваться предварительно в самом скрипте, тоесть передать его извне в виде параметра из дельфийского кода нельзя. А вот как это сделать в скрипте - может кто подскажет.
    Заранее спасибо.
  • Reindeer Moss Eater © (28.02.08 16:12) [1]
    каки везде. конкатенацией строк.
  • Ega23 © (28.02.08 16:13) [2]
    declare @aSQL varchar(1000)
    Set @aSQL='Select * from Table'
    exec(@aSQL)



    Ну а в свою переменную в динамике можешь чё хошь напихать. Глваное за размерность varchar не вылези
  • harisma (28.02.08 16:18) [3]
    Да, забыл сказать, что поле recid имеет тип char(16)

    Это я понимаю, конкатенацией, но не получается. Может я что не так делаю?
    Покажите пожалуйста образец. Следует учитывать, что значения должны быть в кавычках!! То есть результирующий запрос должен получиться типа

    select <somefields> from <sometable>
    where recid in ('a', 'b', 'c', 'd' ...)

  • Ega23 © (28.02.08 16:19) [4]
    '''
  • harisma (28.02.08 16:22) [5]

    > Ega23 ©

    Не понял...
  • Виталий Панасенко(дом) (28.02.08 16:22) [6]

    > Ega23 ©   (28.02.08 16:19) [4]
    >
    > '''

    Лучше QuotedStr
  • Sergey13 © (28.02.08 16:23) [7]
    > [0] harisma   (28.02.08 16:10)

    Заполни значениями временную таблицу и соедини с ней основную.
  • Reindeer Moss Eater © (28.02.08 16:23) [8]
    То есть результирующий запрос должен получиться типа

    а какой типа получается?
  • sniknik © (28.02.08 16:24) [9]
    > Лучше QuotedStr
    формирование в скрипте, в сервере mssql... там тоже есть? видимо отстал от жизни.
  • Виталий Панасенко(дом) (28.02.08 16:26) [10]

    > harisma   (28.02.08 16:22) [5]
    >
    >
    > > Ega23 ©
    >
    > Не понял...
    >

    В коде программы заключи в кавычки.. в чем проблема? а почему
    > Проблема в том, что этот <values set> должен формироваться
    > предварительно в самом скрипте, тоесть передать его извне
    > в виде параметра из дельфийского кода нельзя.
    ?
  • Ega23 © (28.02.08 16:27) [11]

    > Лучше QuotedStr


    В TSQL появилось QuotedStr?????
    Иншалла!!!
  • harisma (28.02.08 16:28) [12]

    > Sergey13 ©   (28.02.08 16:23) [7]
    >
    > > [0] harisma   (28.02.08 16:10)
    >
    > Заполни значениями временную таблицу и соедини с ней основную.
    >

    Так нельзя. Условия дальнейшего использования сформированного скрипта не позволяют

    >Reindeer Moss Eater ©   (28.02.08 16:23) [8]

    >То есть результирующий запрос должен получиться типа

    >а какой типа получается?

    А никакой
  • Виталий Панасенко(дом) (28.02.08 16:29) [13]

    > sniknik ©   (28.02.08 16:24) [9]
    >
    > > Лучше QuotedStr
    > формирование в скрипте, в сервере mssql... там тоже есть?
    >  видимо отстал от жизни.
    >

    Не понял просто вопроса автора..Либо понял не так как ты...Я недавно спрашивал, как объединить удаленный MS SQL и мои данные из FoxPro.. в итоге в проге выбрал что нужно из БД Foxа, сформировал скрипт в проге и все работает... ну, теряю 3-5 сек(при первом подключении к фоксу)..:-)
  • sniknik © (28.02.08 16:30) [14]
    > Так нельзя.
    а как/что можно? и зачем? огласите весь список... а то получается разговор слепого с глухим.
  • harisma (28.02.08 16:38) [15]

    > В коде программы заключи в кавычки.. в чем проблема?


    Не получается. Смотрите, я пишу вот так:
    declare @Str varchar(1000)
    set @Str = '''F09A7082701AA440''' + ',' + '''F091FEB302FBA040''' + ',' + '''F081008347F5A240'''

    но результат выполнения скрипта - пустое множество, хотя я точно знаю, что записи с такими значениями ЕСТЬ.
    Может все же я неправильно формирую значение @Str или неправильно его подставляю?

    select <somefields> from <sometable>
    where recid in (@Str)

    ?
  • Виталий Панасенко(дом) (28.02.08 16:40) [16]
    мне вот это не понятно

    > Проблема в том, что этот <values set> должен формироваться
    > предварительно в самом скрипте,

    - кто/что его формирует ? само по себе как-то ?
  • harisma (28.02.08 16:42) [17]

    > Виталий Панасенко(дом)   (28.02.08 16:40) [16]
    >
    > мне вот это не понятно
    >
    > > Проблема в том, что этот <values set> должен формироваться
    > > предварительно в самом скрипте,
    >
    > - кто/что его формирует ? само по себе как-то ?


    Он формируется из курсора.
  • sniknik © (28.02.08 16:46) [18]
    > Он формируется из курсора.
    ?
    это же готовый список для
    Sergey13 ©   (28.02.08 16:23) [7]
    > Заполни значениями временную таблицу и соедини с ней основную.
    даже создавать временную и заполнять не надо, вместо курсора запрос и соединяй...
  • Виталий Панасенко(дом) (28.02.08 16:47) [19]
    Это я уже понял...Действительно, не пашет в таком виде.Проверил на стандартной БД Northwind...
  • Anatoly Podgoretsky © (28.02.08 16:47) [20]
    > harisma  (28.02.2008 16:38:15)  [15]

    Ты уверен, что у тебя есть запись со значением F09A7082701AA440,F091FEB302FBA040',F081008347F5A240
  • Виталий Панасенко(дом) (28.02.08 16:51) [21]

    > Anatoly Podgoretsky ©   (28.02.08 16:47) [20]
    >
    > > harisma  (28.02.2008 16:38:15)  [15]
    >
    > Ты уверен, что у тебя есть запись со значением F09A7082701AA440,
    > F091FEB302FBA040',F081008347F5A240

    Проверил на СеверномВетре, print выдает что данные есть в переменной...Но выборка не пашет..Если подставить значения - выбирает
    declare @S varchar(1000)
    set @S='''Beverages'''+','+'''Condiments'''
    /*Confections
    Dairy Products
    Grains/Cereals
    Meat/Poultry
    Produce
    Seafood
    */
    select @S
    select * from categories
    where categoryname in (@S
    )

  • harisma (28.02.08 16:52) [22]

    > Anatoly Podgoretsky ©   (28.02.08 16:47) [20]
    >
    > > harisma  (28.02.2008 16:38:15)  [15]
    >
    > Ты уверен, что у тебя есть запись со значением F09A7082701AA440,
    > F091FEB302FBA040',F081008347F5A240

    Записи с recid = ''F09A7082701AA440',
    'F091FEB302FBA040','F081008347F5A240'' нету, но есть записи с
    recid = 'F09A7082701AA440'
    recid = 'F091FEB302FBA040'
    recid = 'F081008347F5A240'
    Вот, как их выбрать?
  • sniknik © (28.02.08 16:56) [23]
    Виталий Панасенко(дом)   (28.02.08 16:51) [21]
    > Проверил на СеверномВетре  .... Если подставить значения - выбирает
    посмотри что советовали в [2] и найди 10 отличий...
  • Виталий Панасенко(дом) (28.02.08 16:57) [24]
    Я так подозреваю, что выборка считает это одним значением..
    потому как этот вариант отработал
    declare @S nvarchar(1000)
    set @S='Beverages'
    /*Confections
    Dairy Products
    Grains/Cereals
    Meat/Poultry
    Produce
    Seafood
    */
    select @S
    select * from categories
    where categoryname in (@S
    )

  • Anatoly Podgoretsky © (28.02.08 16:57) [25]
    > harisma  (28.02.2008 16:52:22)  [22]

    Динамический запрос, а не динамические параметры.
  • Виталий Панасенко(дом) (28.02.08 16:59) [26]

    > sniknik ©   (28.02.08 16:56) [23]
    >
    > Виталий Панасенко(дом)   (28.02.08 16:51) [21]
    > > Проверил на СеверномВетре  .... Если подставить значения
    > - выбирает
    > посмотри что советовали в [2] и найди 10 отличий...
    >

    Извиняюсь, не обратил внимая...Грипп достал...:-).. Мне, вообще суть задачи не понятна... В целом..
  • Виталий Панасенко(дом) (28.02.08 17:04) [27]
    Да, отработало "на ура"..
    declare @S varchar(1000)
    set @S='select * from categories where categoryname in(''Beverages'',
    '
    'Condiments'')'
    exec (@S)

  • Anatoly Podgoretsky © (28.02.08 19:09) [28]
    > Виталий Панасенко(дом)  (28.02.2008 16:57:24)  [24]

    Это не значение, а параметр, и при том один.
  • harisma (28.02.08 20:13) [29]
    В общем, у меня получилось. Согласно совета [2]. :)
    Всем, кто участвовал - спасибо
  • ЮЮ © (29.02.08 04:14) [30]
    А почему бы в первом скрипте сразу не возвращать нужный НД вместо формирования запроса с IN?
 
Конференция "Базы" » Динамическое формирование списка значений для выборки [D5, MSSQL]
Есть новые Нет новых   [134431   +13][b:0][p:0.002]