На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> Передать свой параметр в запрос
    Так и не решил проблему с сортировкой в запросе.
    ExpandedWrap disabled
      SELECT "Articul", "Price" FROM "catalog" WHERE "Articul" IN('111', '055', '5464', '54', '548');


    У меня табличка на wxWidgets я в нее цены пишу, для этого приходится у бд запрашивать еще и артикул и потом программно рассортировывать.
    Сейчас, когда товаров почти 2к вопрос с сортировкой встал остро - грузится около минуты все это дело.
    Проблема в том что, MsSQL возвращает не в том порядке в котором я запрашивал, а в том, в котором находит в базе.
    Мне возвращаемые значения нужно записать в табличку под определенным номером ячейки.
    Данные для запроса я беру из этой же таблицы.

    Было бы супер легко все рассортировать если бы я мог в запрос передать номер ячейки вместе с артикулом,
    и MsSQL вернул бы мне цену вместе с этим номером, я бы просто обновил ячейку в таблице соответствующую номеру.

    Вместо этого мне приходится делать цикл - для каждого артикула пробегать всю таблицу и сравнивать.
    в итоге 2000*2000=4 милиона циклов, что очень печально.

    Можно ли так сделать? Как-нибудь по простому, чтобы базу не грузить слишком сложными конструкциями?
    Помогите пожалуйста. С меня лайки)
    Сообщение отредактировано: TravNik -
      Погодиии .... давай разберемся, не "стоя на голове" ... :blink:

      Цитата TravNik @
      Можно ли так сделать? Как-нибудь по простому, чтобы базу не грузить слишком сложными конструкциями?

      Смысл "клиент-серверной" архитектуры предполагает обратное - все запросы желательно исполнять именно на серваке. Клинет - только "отображатель".

      Цитата TravNik @
      Сейчас, когда товаров почти 2к вопрос с сортировкой встал остро

      Верь мне - это "копейки". Даже меньше.

      Цитата TravNik @
      Проблема в том что, MsSQL возвращает не в том порядке в котором я запрашивал, а в том, в котором находит в базе

      Ты лукавишь. Сервер всегда возвращает то, что и как запросили. Ты запрашивал неправильно.

      Цитата TravNik @
      Вместо этого мне приходится делать цикл - для каждого артикула пробегать всю таблицу и сравнивать.
      в итоге 2000*2000=4 милиона циклов, что очень печально.

      Бла-бла-бла ... я твое повествование пропустил, сорри, и без обид - я действительно хочу помочь.

      А вот далее излагай суть своей задачи. Повторюсь - не так, как ты ее решал и у тебя не получилось!!! А ... какие исходные данные есть (без привязки к каким-то БД), какой результат обсчета ты хотел бы получить. Для упрощения этого вопроса - считай что ты не на программерском форуме, а на форуме филологов. Давай, сначала, спойкойно и подробно ... Мол " есть такие данные" а я хочу "рассчитать такие", условия обсчета "такие".
        man order by
        Сообщение отредактировано: Gonarh -
          Цитата JoeUser @
          А вот далее излагай суть своей задачи

          Исходные данные таблица вида:
          № артикул товар Цена
          ___________________________________________
          1 114454 блаблабла ?
          2 564646 блаблабла ?
          3 654564 блаблабла ?


          Я в цикле прокручиваю всю таблицу. Записываю артикулы. Составляю запрос к бд вида:

          ExpandedWrap disabled
            SELECT "Price" FROM "catalog" WHERE "Articul" IN('111', '055', '5464', '54', '548' ...) Мой_номер_ячейки IN (1, 2, 3 ...);
          //Это лишь пример. Я не знаю как передать параметр с номером ячейки.

          Хотелось бы отправлять в запросе номер ячейки и получать ответ от базы типа:
          Мой_номер_ячейки 1, Цена 15100
          Мой_номер_ячейки 2, Цена 20000
          Мой_номер_ячейки 3, Цена 24564

          Я получаю ответ от бд и Обновляю ячейки с соответствующим номером.

          Цитата JoeUser @
          Ты лукавишь. Сервер всегда возвращает то, что и как запросили. Ты запрашивал неправильно.

          Я не лукавлю. Тот запрос который я привел возвращает именно так как товары идут в базе, а не так как я запрашивал.
          Сообщение отредактировано: TravNik -
            Цитата TravNik @
            Исходные данные таблица вида:
            № артикул товар Цена
            ___________________________________________
            1 114454 блаблабла ?
            2 564646 блаблабла ?
            3 654564 блаблабла ?


            Где "цена"?

            Цитата TravNik @
            Мой_номер_ячейки 1, Цена 15100


            Каково "правило" расчета "номера ячейки"?
              :facepalm:
                Gonarh, тебе замечание - не юродствуй! :wacko:
                  Цитата JoeUser @
                  Где "цена"?

                  Да это таблица на wxWidgets которую я заполняю программно эта таблица (типа Excell таблицы) у меня на компе, мне ее нужно заполнить из бд сервера.
                  Цены нет так как запрос еще не отправлен))

                  Товарищи, дабы не завязнуть в ненужной терминологии и не залезть в дебри спрошу проще:

                  КАК ПОМЕТИТЬ ЗАПРОС???? Мне всего то нужно отправить МЕТКУ - чтобы БД на сервере вернула мне эту метку и я знал КУДА МНЕ ЗАПИСАТЬ ОТВЕТ, А ИМЕННО В КАКУЮ ЯЧЕЙКУ. Блин, ну как же проще то объяснить... Ну всего делов, чтобы запрос мне вернул то что я ему отправил.

                  Отправил к примеру SELECT "Price" бла бла бла и передал номер ячейки
                  А сервер мне вернул ответ с этим номером, чтобы я знал какую мне ячейку обновлять, чтобы избавится от ненужной сортировки...

                  Если еще проще:
                  1) Я спрашиваю у БД - какая цена на этот артикул? Верни мне пожалуйста цену на этот артикул и циферку 1(так как в моей локальной таблице этот товар лежит в 1 ячейке)

                  2) БД возвращает мне ответ: Цена 20000, циферка 1

                  3) Я обновляю свою локальную таблицу - записываю в первую строку цену. ПРОФИТ.
                  Сообщение отредактировано: TravNik -
                    TravNik, еще раз ... Выкинь все мысли из головы. Выкинул? Осознай гипотизо-аксиому: "В правильно поставленном вопросе содержится 50% правильного ответа".

                    Нет таблиц, нет vxWigdets, ваще компа нед ... Есть ИСХОДНАЯ ИНФА, обозначим ее как "И". Есть ожидаемый тобой результат, обозначим его как "Р". И есть действие(функция) которая этот результат даст, обозначим ее "F".

                    Итого, имеем: F(И) = Р

                    Твоя задача: четко, ПОДЧЕРКИВАЮ, четко и детально обозначить все две составляющие "И" и "Р". Тогда, и только тогда, мы сможем осознать что должна "F", и найти ее реализацию!!!

                    Цитата TravNik @
                    КАК ПОМЕТИТЬ ЗАПРОС???? Мне всего то нужно отправить МЕТКУ - чтобы БД на сервере вернула мне эту метку и я знал КУДА МНЕ ЗАПИСАТЬ ОТВЕТ, А ИМЕННО В КАКУЮ ЯЧЕЙКУ. Блин, ну как же проще то объяснить... Ну всего делов, чтобы запрос мне вернул то что я ему отправил.

                    Какую метку, метку чего, метку куда, и метку откуда? Это риторический вопрос. Отвечать не нужно! Для "постороннего наблюдателя", нас, форумчан - это темная темнота. Поэтому, вернись к началу этого поста, почитай, и изложи системно. Там нужно всего лишь два важных параметра "есть" и "хочу получить".
                      Цитата JoeUser @
                      Там нужно всего лишь два важных параметра "есть" и "хочу получить".


                      Есть артикулы 432, 234, 23345, 65456, 546, 5464, и соответствующие им цифры - 1, 2, 5, 9, 4, 11
                      Хочу получить цену по этим артикулам и соответствующие артикулам цифры.

                      Оправляю АРТИКУЛ и ЦИФРУ, получаю ЦЕНУ из таблицы и ЦИФРУ.
                        Добавь в грид поле. Спрячь его. При загрузке данных запиши в него Aртикул. Используй ети данные в запросе какая цена продукта с етим артикулом.
                          Цитата MIF @
                          Добавь в грид поле. Спрячь его. При загрузке данных запиши в него Aртикул. Используй ети данные в запросе какая цена продукта с етим артикулом.

                          Такое поле и так уже есть, притом не скрытое. И артикулы в это поле уже записаны и рассортированы так как надо. И данные эти я в запросе использую, и цену получаю.
                          Проблема в том, что приходится полученные от БД данные сортировать, а вот если бы я мог послать вместе с артикулом номер ячейки грида и получить цену и номер ячейки - то можно было бы обойтись без сортировки. Но как передать удаленной БД номер ячейки, так чтобы он вернул цену с этим номером я не знаю.
                          Сообщение отредактировано: TravNik -
                            Цитата TravNik @
                            Есть артикулы 432, 234, 23345, 65456, 546, 5464, и соответствующие им цифры - 1, 2, 5, 9, 4, 11
                            Хочу получить цену по этим артикулам и соответствующие артикулам цифры.

                            Оправляю АРТИКУЛ и ЦИФРУ, получаю ЦЕНУ из таблицы и ЦИФРУ.


                            Давай-ка структуру своих таблиц. Ибо непонятен термин "соответствующя цифра". Цифра понятно, но "способ соответствия" каков? Это таблица соответствия или че?
                              Цитата JoeUser @
                              Давай-ка структуру своих таблиц.


                              user posted image

                              user posted image
                                Цитата JoeUser @
                                Gonarh, тебе замечание - не юродствуй!
                                Сорри за флуд - чья б корова мычала :whistle: !
                                  TravNik чесслово, очень внимательно читал не понял ни одной буквы.
                                  1. какую проблему решаем? Показать в интерфейсе артикулы и цены?
                                  Тогда почему спрашиваем по одному полю? Почему нельзя спросить все сразу?
                                  2 артикулы приходят "снаружи" и надо заполнить грид полными данными?
                                  Ну так опять подход неверный. Не надо отдельно искать. Надо брать в БД весь набор данных и заполнять строку целиком.
                                    Цитата Павел Калугин @
                                    Тогда почему спрашиваем по одному полю?

                                    ExpandedWrap disabled
                                      SELECT "Articul", "Price" FROM "catalog" WHERE "Articul" IN('111', '055', '5464', '54', '548');

                                    Вроде я сразу несколько полей запросил - артикулы и цены.

                                    Цитата Павел Калугин @
                                    Показать в интерфейсе артикулы и цены?

                                    Верно. Как бы вы решили такую задачу? При условии, что цену нужно получить для конкретных артикулов которые грузятся из файла на компьютере, а не из БД.
                                    Файл с артикулами находится в папке с программой и они от туда подгружаются в программу - из БД их грузить нельзя, так как они в файле рассортированы вручную
                                    особым образом.
                                      Напиши хранимую процедуру с параметром типа xml. В параметре передай структуру типа
                                      ExpandedWrap disabled
                                        <rows>
                                        <row id=1 articul=123\>
                                        <row id=5 artikul=235\>
                                        <\rows>
                                      .
                                      Сджойнишь ее с таблицей артикулов. Возвратишь рекордсет с артикулами, ценой и номерами строк в клиентском гриде.
                                        Цитата MIF @
                                        Сджойнишь ее с таблицей артикулов. Возвратишь рекордсет с артикулами, ценой и номерами строк в клиентском гриде.

                                        Объясни пожалуйста подробнее. Я в MsSQL нуб, знаю пару базовых запросов...

                                        Это подразумевает правку таблицы на сервере? Если да, то не вариант, модификация серверной части запрещена политикой.
                                        Сообщение отредактировано: TravNik -
                                          TravNik, я вот согласен с Павлом:

                                          Цитата Павел Калугин @
                                          TravNik чесслово, очень внимательно читал не понял ни одной буквы.

                                          Твое "графическое" представление - по сути, опять непонятный вопрос. Структуру таблиц принято описывать используя DDL.

                                          Пример описания таблицы с именем "Phones":

                                          ExpandedWrap disabled
                                            CREATE TABLE public."Phones" (
                                              "Id" INTEGER DEFAULT nextval('"Phones_Id_seq1"'::regclass) NOT NULL,
                                              "Name" VARCHAR(20),
                                              "PhoneType" VARCHAR(20),
                                              "PhoneNum" VARCHAR(20),
                                              CONSTRAINT "Phones_pkey1" PRIMARY KEY("Id")
                                            );

                                          Вот в таком виде я просил предоставить данные о таблицах БД, из которых ты собираешься извлекать информацию.

                                          Цитата TravNik @
                                          При условии, что цену нужно получить для конкретных артикулов которые грузятся из файла на компьютере, а не из БД.

                                          Это всего лишь вопрос динамического формирования SQL-запроса. Иными словами, загрузив файл артикулов и их порядков, ты, на основе загруженного, формируешь запрос к БД, скармливаешь его серверу, ну и получаешь нужный ответ.

                                          Поэтому опубликуй структуру таблиц БД (не всех, а в которых есть интересующие данные), дальше будем смотреть, как строить нужный тебе запрос.
                                            Цитата TravNik @
                                            Это подразумевает правку таблицы на сервере?

                                            Что такое JOIN.
                                              Цитата JoeUser @
                                              Вот в таком виде я просил предоставить данные о таблицах БД, из которых ты собираешься извлекать информацию.


                                              Локальная таблица:
                                              ExpandedWrap disabled
                                                "PositonRow"  INTEGER,
                                                "ArtNo"       VARCHAR(50),
                                                "TovarName"   VARCHAR(100),
                                                "Price"       INTEGER;


                                              MSSQL:
                                              ExpandedWrap disabled
                                                "OfferID"     INTEGER,
                                                "ProductID"   INTEGER,
                                                "Amount"      FLOAT,
                                                "Price"       FLOAT,
                                                "SupplyPrice" FLOAT,
                                                "ColorID"     INTEGER,
                                                "SizeID"      INTEGER,
                                                "ArtNo"       VARCHAR(50);


                                              Помогите пожалуйста. MsSQL только начал изучать, сам не разберусь, ибо мои познания сейчас на уровне SELECT / UPDATE.
                                              Сообщение отредактировано: TravNik -
                                                Цитата TravNik @
                                                Файл с артикулами находится в папке с программой и они от туда подгружаются в программу - из БД их грузить нельзя, так как они в файле рассортированы вручную особым образом.

                                                Отлично. Пусть, к примеру, есть локальный файл следующего содержимого:

                                                ExpandedWrap disabled
                                                  Артикул;Название
                                                  ====================================
                                                  31200;"Промтовары"
                                                  110;"Ювелирные издения"
                                                  4777;"Бытовая химия"


                                                Твоя задача - программно распарсить его и получить первую часть твоего будущего SQL-запроса.
                                                Должно получится следующее:

                                                ExpandedWrap disabled
                                                  WITH Art ("SortKey", "ArtNo", "ArtName") AS (
                                                    SELECT
                                                      *
                                                    FROM (
                                                      VALUES
                                                        (1, 31200, 'Промтовары'),
                                                        (2,   110, 'Ювелирные издения'),
                                                        (3,  4777, 'Бытовая химия')
                                                    ) AS L
                                                  )


                                                Конструкция WITH позволяет задать временно именованный результирующий набор. Его называют "Обобщенное табличное выражение". В данном случае - мы данные не берем из БД, а собираем "синтетически" в конструкции VALUES. Заметь, что цифры 1,2,3 - берутся просто как порядковые номера строк из того твоего файла. Они будут первым ключом сортировки.

                                                Попробуем составить окончательный запрос.

                                                ExpandedWrap disabled
                                                  WITH Art ("SortKey", "ArtNo", "ArtName") AS (
                                                    SELECT
                                                      *
                                                    FROM (
                                                      VALUES
                                                        (1, 31200, 'Промтовары'),
                                                        (2,   110, 'Ювелирные издения'),
                                                        (3,  4777, 'Бытовая химия')
                                                    ) AS L
                                                  )
                                                  SELECT
                                                    Art."ArtNo",
                                                    Art."ArtName",
                                                    T."Price"
                                                  FROM
                                                    Art
                                                  LEFT JOIN
                                                    "Table" AS T ON  -- а вот тут уже "Table" - это имя реальной таблицы из твоей БД
                                                        T."ArtNo" = Art."ArtNo"
                                                  ORDER BY
                                                    Art."SortKey",
                                                    Art."ArtName"


                                                Собственно и все. В результате должно вернуться нечто, типа:"

                                                ExpandedWrap disabled
                                                  ArtNo   ArtName             Price
                                                  ===================================
                                                  31200  "Промтовары"         1000
                                                  110    "Ювелирные издения"  700000
                                                  4777   "Бытовая химия"      500


                                                ЗЫ: Единственное, где я не совсем понял - это как можно выставлять цену по артикулу? Возможно я "плаваю" в предмете. Но, насколько я понимаю, артикул - это код группы товаров. И если это так, то тогда нужно либо добавлять столбец "Наименование товара", либо по "артикулу" считать min, max, agv ... Иначе в таком виде, как я написал выше - запрос выдает бог-весть-что, хотя и клеится по "ArtNo".
                                                  Цитата TravNik @
                                                  они в файле рассортированы вручную особым образом.

                                                  В файле есть понятие порядка следования записей. Физического порядка. Однако для SQL-сервера понятия физического порядка не существует, для него существует только понятие порядка, определяемого выражением сортировки.
                                                  Вывод - при получении информации из файла ты должен дополнить её неким дополнительным полем, при сортировке по которому порядок следования записей будет соответствовать физическому порядку записей в исходном файле.
                                                  Вариант реализации такой операции показал JoeUser (ввёл дополнительное поле SortKey и заполнил его последовательными значениями).
                                                    JoeUser, я немного изменил ваш код, вроде ошибок нет, но сервер ничего не возвращает...
                                                    ExpandedWrap disabled
                                                      WITH Art ("SortKey", "ArtNo") AS
                                                      (
                                                       SELECT * FROM (
                                                         VALUES
                                                           (0, '001459'),
                                                           (1, '001078'),
                                                           (2, '001190')
                                                         ) AS L
                                                      )
                                                       
                                                      SELECT
                                                       Art."SortKey",
                                                       T."Price"
                                                      FROM
                                                       Art
                                                      Left JOIN
                                                       "Server"."Catalog"."Product" AS T ON
                                                               T."ArtNo" = Art."ArtNo"
                                                      ORDER BY
                                                      Art."SortKey"


                                                    Еще не понял что такое ") AS L" и почему эта L далее нигде не используется...
                                                    Сообщение отредактировано: TravNik -
                                                      Цитата TravNik @
                                                      JoeUser, я немного изменил ваш код, вроде ошибок нет, но сервер ничего не возвращает...

                                                      Скорее всего проблема где-то в "склейке". Может быть в таблице БД поле "ArtNo" заполнено цифрами с концевыми (и/или начальными) пробелами. Если это так, то условие склейки надо модифицировать как-то так:

                                                      ExpandedWrap disabled
                                                        WITH Art ("SortKey", "ArtNo") AS
                                                        (
                                                         SELECT * FROM (
                                                           VALUES
                                                             (0, '001459'),
                                                             (1, '001078'),
                                                             (2, '001190')
                                                           ) AS L
                                                        )
                                                        SELECT
                                                         Art."SortKey",
                                                         T."Price"
                                                        FROM
                                                         Art
                                                        LEFT JOIN
                                                          "Server"."Catalog"."Product" AS T ON
                                                            LTRIM(RTRIM(T."ArtNo")) = Art."ArtNo" -- <--- тут надо смареть LTRIM RTRIM, я с MS SQL не работал
                                                        ORDER BY
                                                        Art."SortKey"

                                                      Цитата TravNik @
                                                      Еще не понял что такое ") AS L" и почему эта L далее нигде не используется...

                                                      Когда источник FROM - не таблица, а возвращаемый набор от какой-то конструкции или подзапроса, то синтаксис SQL требует именования такого селекта посредством AS, даже если нет явного использования его полей. Хотя лучче у Akin'ы спросить, возможно он ответит более грамотно.
                                                        Цитата JoeUser @
                                                        "ArtNo" заполнено цифрами с концевыми (и/или начальными) пробелами

                                                        Я проверял через админку, через HeidiSQL - пробелов нет и SELECT по этим артикулам возвращает цены...
                                                        В чем еще может быть причина?
                                                          Цитата TravNik @
                                                          В чем еще может быть причина?

                                                          :-?
                                                          Посмотри, а такой запрос хоть что нить вернет?
                                                          ExpandedWrap disabled
                                                            WITH Art ("SortKey", "ArtNo") AS
                                                            (
                                                             SELECT * FROM (
                                                               VALUES
                                                                 (0, '001459'),
                                                                 (1, '001078'),
                                                                 (2, '001190')
                                                               ) AS L
                                                            )
                                                            SELECT
                                                             Art."SortKey",
                                                             T."Price"
                                                            FROM
                                                             Art
                                                            LEFT JOIN
                                                              "Server"."Catalog"."Product" AS T ON
                                                                LTRIM(RTRIM(T."ArtNo")) = '001459' -- <---
                                                            ORDER BY
                                                            Art."SortKey"
                                                            Цитата JoeUser @
                                                            Посмотри, а такой запрос хоть что нить вернет?

                                                            Ничего... Ноль на выходе...
                                                              Цитата TravNik @
                                                              Ничего... Ноль на выходе...

                                                              Покажите запрос В ТОМ ВИДЕ, В КАКОМ ЗАПУСКАЕТЕ.
                                                                Цитата Akina @
                                                                В ТОМ ВИДЕ, В КАКОМ ЗАПУСКАЕТЕ.

                                                                ExpandedWrap disabled
                                                                  WITH Art ("SortKey", "ArtNo") AS
                                                                  (
                                                                   SELECT * FROM (
                                                                     VALUES
                                                                       (0, '001459'),
                                                                       (1, '001078'),
                                                                       (2, '001190')
                                                                     ) AS L
                                                                  )
                                                                  SELECT
                                                                   Art."SortKey",
                                                                   T."Price"
                                                                  FROM
                                                                   Art
                                                                  LEFT JOIN
                                                                    "SERVER"."Catalog"."Offer" AS T ON
                                                                      T."ArtNo" = '001459'
                                                                  ORDER BY
                                                                  Art."SortKey"


                                                                Единственное - SERVER меняю на свой.
                                                                Сообщение отредактировано: TravNik -
                                                                  А
                                                                  ExpandedWrap disabled
                                                                    SELECT T."Price"
                                                                    FROM "SERVER"."Catalog"."Offer" AS T
                                                                    WHERE T."ArtNo" = '001459'

                                                                  записи возвращает?

                                                                  Кстати... а с какой версией сервера мы имеет дело? и в каком клиенте выполняется запрос? клиент вообще переваривает WITH?
                                                                  Ну просто потому, что твой текст запроса, если не вызывает ошибку, просто обязан вернуть как минимум три записи...
                                                                  Сообщение отредактировано: Akina -
                                                                    Цитата Akina @
                                                                    клиент вообще переваривает WITH?

                                                                    Вот и я о том же. "Ничего не возвращать" сервер просто не может. Или возвращает ошибку, или возвращает >= 0 строк.
                                                                      Для подключения использую модуль adoConnect. После запроса CountRow=0.
                                                                      conn.getLastErrorDescription() выдает - no errors.
                                                                      Может частями как-нибудь запрос оттестить?
                                                                      Сообщение отредактировано: TravNik -
                                                                        Цитата Akina @

                                                                        Кстати... а с какой версией сервера мы имеет дело? и в каком клиенте выполняется запрос? клиент вообще переваривает WITH?

                                                                        Сервер - MsSQL 2008 R2

                                                                        А клиент тут причем? Клиент вообще без SQL. Локальные данные сохраняю в свой формат. Весь запрос отправлял на сервер...
                                                                        Может я не так что сделал?
                                                                          Цитата TravNik @
                                                                          А клиент тут причем? Клиент вообще без SQL

                                                                          при том что -
                                                                          Цитата TravNik @
                                                                          Для подключения использую модуль adoConnect
                                                                          .
                                                                          Создайте на сервере процедуру и получите от нее ответ.
                                                                            Цитата Bas @
                                                                            Создайте на сервере процедуру и получите от нее ответ.

                                                                            Судя по диалогу выше, он (ТС) на серваке ниче делать не может.

                                                                            Еще есть совет. Когда мы пишем чего-то на каком-то языке программирования, зачастую бывает приходится пользоваться отладчиком для выявления трабла. С запросами SQL картина очень похожая. Советую найти норм инструмент для интерактивной отладки запросов. На счет именно M$ SQL не подскажу, но предлагаю глянуть на два продукта - EMS Sql Manager (для конструирования таблиц БД самое то), Navicat (для отладки запросов - просто божественно). Версии с "таблетками от жадности" можно найти на rutracker.org, хотя еще раз подчеркну, не совсем уверен - тянут ли они M$ SQL, ибо я пользую исключительно PostgreSQL, и малеха присматриваюсь к MySQL.

                                                                            Используя выше названные инструменты, можно обойтись без прочих "прокладок" и решать суть - "состоятельность" того или иного запроса. И как только запрос отлажен, только тогда пытаемся вписать его вызов с свою прогу.
                                                                              Тс, используй MS Management Studio для отладки запросов.
                                                                                Цитата JoeUser @
                                                                                Судя по диалогу выше, он (ТС) на серваке ниче делать не может.

                                                                                Судя по диалогу, ТС может использовать в качестве клиента HeidiSQL. А там предложение WITH прекрасно работает - если не накосячить в синтаксисе и версия сервера позволяет.
                                                                                  Цитата Akina @
                                                                                  удя по диалогу, ТС может использовать в качестве клиента HeidiSQL.
                                                                                  Ну на счет HeidiSQL - эт да, клиентская часть бывает такая иногда клиентская))) Я имел ввиду - де-факто невозможность реги своих процедур на серваке БД.
                                                                                    TravNik, Опять ничего не понял.
                                                                                    Почему не тащите из БД наименование?
                                                                                    Что за "особая сортировка артикулов"? "Дерево" чтоли? Так почему оно в файле а не в БД?
                                                                                    Нет прав править основную БД так кто запретит создать рядом еще одну?
                                                                                    Написать хранимую процедуру да, это на сервере, но это не структура таблиц. Обратитесь к администратору сервера.
                                                                                    Часть данных, необходимых для работы ПО в локальном файле юзера а часть на сервере, и в интерфейсе енто надо клеить? Я б расстрелял разработчика. Чесслово.
                                                                                    Но если препод (а больше никто так бредово задачу не ставит) захотел то откройте бук он Лайн ( справка от мускул) и найдите там про open xml там и примеры есть как используют этот костыль.
                                                                                    Но, повторю, хранить часть данных на сервере а часть где-то в локальном файле черевато большими проблемами. В Вашем случае это "ключ сортировки", возможно еще и наименование артикула, так как в запросе его нет.
                                                                                    Может просто от Вас требуют вывод "дерева" в список?
                                                                                    Почему в файле и в БД для одного и того же разные типы данных? В чем подвох?


                                                                                    JoeUser ваше предложение описывать структуру данных в DDL мягко говоря неверное а точно выражаясь убогое. Если хотите чтобы Ваше описание понял кто-то кроме Вас предоставьте ER диаграмму в одной из общепринятых нотаций

                                                                                    Добавлено
                                                                                    JoeUser не надо смотреть левых продуктов. Все что надо для работы с ms SQL абсолютно точно указал Mif в 38 сообщении.
                                                                                      Цитата Павел Калугин @
                                                                                      JoeUser ваше предложение описывать структуру данных в DDL мягко говоря неверное а точно выражаясь убогое. Если хотите чтобы Ваше описание понял кто-то кроме Вас предоставьте ER диаграмму в одной из общепринятых нотаций

                                                                                      Павел, ты малеха категоричен. "На заре моей SQL-юности" как-то Akina ткнул меня носом как описывать более правильно БД-шные сущности, и был по сути прав. И вот тут DDL остался единственным вменяемым кандидатом - коротко, ясно и понятно. А если тебе хочется граффити - оно у нас есть! :lol:
                                                                                        ExpandedWrap disabled
                                                                                          WITH Art ("SortKey", "ArtNo") AS
                                                                                          (
                                                                                           SELECT * FROM (
                                                                                             VALUES
                                                                                               (0, '001459'),
                                                                                               (1, '001078'),
                                                                                               (2, '001190')
                                                                                             ) AS L
                                                                                          )
                                                                                          SELECT
                                                                                           Art."SortKey",
                                                                                           T."Price"
                                                                                          FROM
                                                                                           Art
                                                                                          LEFT JOIN
                                                                                            "SERVER"."Catalog"."Offer" AS T ON
                                                                                              T."ArtNo" = '001459'
                                                                                          ORDER BY
                                                                                          Art."SortKey"



                                                                                        /* Ошибка SQL (8155): No column name was specified for column 1 of 'L'
                                                                                        No column name was specified for column 2 of 'L'. */
                                                                                        /* Affected rows: 0 Найденные строки: 0 Предупреждения: 0 Длительность 0 of 1 query: 0,000 sec. */
                                                                                          Цитата JoeUser @
                                                                                           
                                                                                          ExpandedWrap disabled
                                                                                            SELECT
                                                                                                *
                                                                                              FROM (
                                                                                                VALUES
                                                                                                  (1, 31200, 'Промтовары'),
                                                                                                  (2,   110, 'Ювелирные издения'),
                                                                                                  (3,  4777, 'Бытовая химия')
                                                                                              ) AS L

                                                                                          Мил человек, а в какой версии MSSql это не вернет ошибку вида Сообщение 8155, уровень 16, состояние 2, строка 20 No column name was specified for column 1 of 'L'.?

                                                                                          или ты вот этот пример из BOL так "доработал"

                                                                                          ExpandedWrap disabled
                                                                                            IF OBJECT_ID('dbo.Person','U') IS NOT NULL DROP TABLE dbo.Person;
                                                                                            GO
                                                                                            CREATE TABLE dbo.Person(ID int, Name varchar(30), Mother int, Father int);
                                                                                            GO
                                                                                            INSERT dbo.Person
                                                                                            VALUES(1, 'Sue', NULL, NULL)
                                                                                                  ,(2, 'Ed', NULL, NULL)
                                                                                                  ,(3, 'Emma', 1, 2)
                                                                                                  ,(4, 'Jack', 1, 2)
                                                                                                  ,(5, 'Jane', NULL, NULL)
                                                                                                  ,(6, 'Bonnie', 5, 4)
                                                                                                  ,(7, 'Bill', 5, 4);
                                                                                            GO
                                                                                            -- Create the recursive CTE to find all of Bonnie's ancestors.
                                                                                            WITH Generation (ID) AS
                                                                                            (
                                                                                            -- First anchor member returns Bonnie's mother.
                                                                                                SELECT Mother
                                                                                                FROM dbo.Person
                                                                                                WHERE Name = 'Bonnie'
                                                                                            UNION
                                                                                            -- Second anchor member returns Bonnie's father.
                                                                                                SELECT Father
                                                                                                FROM dbo.Person
                                                                                                WHERE Name = 'Bonnie'
                                                                                            UNION ALL
                                                                                            -- First recursive member returns male ancestors of the previous generation.
                                                                                                SELECT Person.Father
                                                                                                FROM Generation, Person
                                                                                                WHERE Generation.ID=Person.ID
                                                                                            UNION ALL
                                                                                            -- Second recursive member returns female ancestors of the previous generation.
                                                                                                SELECT Person.Mother
                                                                                                FROM Generation, dbo.Person
                                                                                                WHERE Generation.ID=Person.ID
                                                                                            )
                                                                                            SELECT Person.ID, Person.Name, Person.Mother, Person.Father
                                                                                            FROM Generation, dbo.Person
                                                                                            WHERE Generation.ID = Person.ID;
                                                                                            GO
                                                                                          Сообщение отредактировано: Павел Калугин -
                                                                                            Цитата Павел Калугин @
                                                                                            Мил человек, а в какой версии MSSql это не вернет ошибку вида Сообщение 8155, уровень 16, состояние 2, строка 20 No column name was specified for column 1 of 'L'.?

                                                                                            Положа лапу на сердце - тестил на PostgreSQL'е. Если такой синтаксис не канает - WITH можно заменить вложенным селектом, VALUES - можно заменить UNION'ами. Как говорится, нет преграды патриотам (С) :lol:
                                                                                              TravNik еще раз, объясни неразумному почему ты часть данных хранишь в файле на клиенте? Почему их нет в БД на сервере? Или они там есть а ты про них не знаешь и потому мудришь с файлами на клиенте?
                                                                                              Про танцы с бубном уже писали - делать через XML почитай про xQuery например.
                                                                                              из справки
                                                                                              ExpandedWrap disabled
                                                                                                DECLARE @x xml
                                                                                                SET @x = '<ROOT><a>111</a></ROOT>'
                                                                                                SELECT @x.query('/ROOT/a')



                                                                                              на крайняк сработает вот такой изврат
                                                                                              ExpandedWrap disabled
                                                                                                CREATE table #Art (SortKey INT, ArtNo NVARCHAR(50))
                                                                                                INSERT INTO #Art
                                                                                                        (SortKey, ArtNo)
                                                                                                   VALUES
                                                                                                     (0, '001459'),
                                                                                                     (1, '001078'),
                                                                                                     (2, '001190')
                                                                                                 
                                                                                                SELECT
                                                                                                 *
                                                                                                -- тут твои поля, звездочку убрать
                                                                                                FROM
                                                                                                 #Art AS Art
                                                                                                -- тут твои джойны
                                                                                                ORDER BY
                                                                                                Art.SortKey


                                                                                              Добавлено
                                                                                              Цитата JoeUser @
                                                                                              Положа лапу на сердце - тестил на PostgreSQL'е

                                                                                              А чтож бедняге топикстартеру про это ни слова? в MS такое не работает же.
                                                                                                Цитата Павел Калугин @
                                                                                                А чтож бедняге топикстартеру про это ни слова? в MS такое не работает же.

                                                                                                Виноват :-?
                                                                                                  Цитата Павел Калугин @
                                                                                                  TravNik еще раз, объясни неразумному почему ты часть данных хранишь в файле на клиенте? Почему их нет в БД на сервере? Или они там есть а ты про них не знаешь и потому мудришь с файлами на клиенте?


                                                                                                  Модифицировать любым образом серверную бд - не могу, так как откажут в обновлении платформы. Даже создать рядом свою табличку не могу. Любое вмешательство в серверную бд, или файлы платформы = отказ в обслуживании. Доступ и возможность модификации есть. Read only вообщем.
                                                                                                    Можно попробовать преобразовать как-то так:
                                                                                                    ExpandedWrap disabled
                                                                                                      SELECT
                                                                                                        *
                                                                                                      FROM (
                                                                                                        SELECT 0 AS "SortKey", '001459' AS "ArtNo"
                                                                                                        UNION
                                                                                                        SELECT 1 AS "SortKey", '001078' AS "ArtNo"
                                                                                                        UNION
                                                                                                        SELECT 2 AS "SortKey", '001190' AS "ArtNo"
                                                                                                      ) AS Art
                                                                                                      LEFT JOIN
                                                                                                        "SERVER"."Catalog"."Offer" AS T ON
                                                                                                          T."ArtNo" = '001459'
                                                                                                      ORDER BY
                                                                                                      Art."SortKey"

                                                                                                    Но это я не проверял по синтаксису, чисто предположение.
                                                                                                      TravNik черт тя побери ;) ,. не читаешь, что пишу тебе? Может эти критерии уже есть?
                                                                                                      Может на том же сервере рядом создашь еще одну БД со своими примочками?

                                                                                                      JoeUser так проверь, потом пиши. угу?

                                                                                                      Добавлено
                                                                                                      TravNik вот те пример с твоим XML

                                                                                                      ExpandedWrap disabled
                                                                                                        declare @xml xml
                                                                                                        SELECT @xml='<rows>
                                                                                                                    <row id = "0">001459</row>
                                                                                                                    <row id = "1">001078</row>
                                                                                                                    <row id = "2">001190</row>
                                                                                                                  </rows>'
                                                                                                         
                                                                                                        select b.value('@id' , 'int') [id], b.value('.' , 'varchar(50)') [content]
                                                                                                        from @xml.nodes('/rows/row') a(b)


                                                                                                      ЗЫ. кстати странно. Сервер пилить низя, а клиента можно.. Ужас просто

                                                                                                      Добавлено
                                                                                                      Цитата TravNik @
                                                                                                      так как откажут в обновлении платформы.

                                                                                                      1 це ,чтоли?
                                                                                                      Сообщение отредактировано: Павел Калугин -
                                                                                                        Цитата Павел Калугин @
                                                                                                        Может на том же сервере рядом создашь еще одну БД со своими примочками?

                                                                                                        Нет этих критериев нет. Я бы мог подробно описать программу, как она работает, почему часть данных храню локально, но поверь, так как работает сейчас - единственный вариант. Я SQL только начал изучать, думал отправить запрос со своим параметром, и получить ответ с сортировкой по этому параметру просто, а оказалось вон как...
                                                                                                          Цитата TravNik @
                                                                                                          почему часть данных храню локально,

                                                                                                          Я отвечу сразу почему и зачем - чтобы потом побольше переделать и чтоб без тебя никто сопровождать не смог ;)

                                                                                                          На том же сервере MS ты в легкую можешь создать еще одну базу данных и положить в нее свои таблички со своими .... прибабахами
                                                                                                          В запросе (во фроме) придется писать в виде БД.Схема.Таблица
                                                                                                          и все, телемаркет... Радуйся. Мало того, если при переносе каком-нибудь файл пролюбишь прога твоя не сломается. А файлы свои ты рано или поздно терять начнешь и иметь головняк почему вдруг работать перестало. Это факт...
                                                                                                          Сообщение отредактировано: Павел Калугин -
                                                                                                            Помогите, чем можИте люди добре.
                                                                                                            Сообщение отредактировано: TravNik -
                                                                                                              Цитата TravNik @
                                                                                                              Это работает, но задача - вернуть цену по артикулу, вместе с номером ячейки, а тут даже обращения к таблице нету...

                                                                                                              так.. а думать лень совсем?
                                                                                                              воткни этот запрос во фром (в скобках и после него as art) и сджойни с чем надо :)

                                                                                                              Добавлено
                                                                                                              Скайп это не наш метод :)
                                                                                                                Цитата Павел Калугин @
                                                                                                                JoeUser так проверь, потом пиши. угу?

                                                                                                                Проверить на M$ SQL'е нет возможности. И ты это ... полегче немного <_<
                                                                                                                  смотри сюдой у тебя была написана вот такая хня, по совету мастера прогресса...
                                                                                                                  ExpandedWrap disabled
                                                                                                                    WITH Art ("SortKey", "ArtNo") AS
                                                                                                                    (
                                                                                                                     SELECT * FROM (
                                                                                                                       VALUES
                                                                                                                         (0, '001459'),
                                                                                                                         (1, '001078'),
                                                                                                                         (2, '001190')
                                                                                                                       ) AS L
                                                                                                                    )
                                                                                                                    SELECT
                                                                                                                     Art."SortKey",
                                                                                                                     T."Price"
                                                                                                                    FROM
                                                                                                                     Art
                                                                                                                    LEFT JOIN
                                                                                                                      "SERVER"."Catalog"."Offer" AS T ON
                                                                                                                        T."ArtNo" = '001459'
                                                                                                                    ORDER BY
                                                                                                                    Art."SortKey"


                                                                                                                  выкидываем лишнее, остается
                                                                                                                  ExpandedWrap disabled
                                                                                                                    SELECT
                                                                                                                     Art.SortKey,
                                                                                                                     T.Price
                                                                                                                    FROM
                                                                                                                    [B] Art[/B]
                                                                                                                    LEFT JOIN
                                                                                                                      SERVER.Catalog.Offer AS T ON
                                                                                                                        T.ArtNo = Art.ArtNo
                                                                                                                    ORDER BY
                                                                                                                    Art.SortKey


                                                                                                                  Осталось мелочь, подправить XML и всадить его сюдой

                                                                                                                  ExpandedWrap disabled
                                                                                                                    declare @xml xml
                                                                                                                    SET @xml='<rows>
                                                                                                                                <row id = "0">001459</row>
                                                                                                                                <row id = "1">001078</row>
                                                                                                                                <row id = "2">001190</row>
                                                                                                                              </rows>'
                                                                                                                     
                                                                                                                    SELECT
                                                                                                                     Art.SortKey,
                                                                                                                     T.Price
                                                                                                                    FROM
                                                                                                                    (select b.value('@id' , 'int') [SortKey], b.value('.' , 'varchar(50)') [ArtNo]
                                                                                                                    from @xml.nodes('/rows/row') a(b) )as Art
                                                                                                                    LEFT JOIN
                                                                                                                      SERVER.Catalog.Offer AS T ON
                                                                                                                        T.ArtNo = Art.ArtNo
                                                                                                                    ORDER BY
                                                                                                                    Art.SortKey
                                                                                                                    Цитата Павел Калугин @
                                                                                                                    так.. а думать лень совсем?
                                                                                                                    воткни этот запрос во фром (в скобках и после него as art) и сджойни с чем надо

                                                                                                                    Я только начал SQL изучать. От моего языка он отличается синтаксисом, построением, логикой. Для меня это темный лес. Не думайте что я ленивый, если бы я хоть чуть разбирался в SQL я наверняка бы сделал сам, но к сожалению не могу. Я понимаю что вы тут друг с другом привыкли общаться на равных, но я нуб.
                                                                                                                      Цитата JoeUser @

                                                                                                                      Джо, ты чайнику задавшему вопрос по MSSql впариваешь ответ с постргресовскими фичами. Я очень мягок... Жаль в рейтинг тебе минусов наляпать не могу...
                                                                                                                        Цитата Павел Калугин @
                                                                                                                        declare @xml xml
                                                                                                                        SET @xml='<rows>
                                                                                                                                    <row id = "0">001459</row>
                                                                                                                                    <row id = "1">001078</row>
                                                                                                                                    <row id = "2">001190</row>
                                                                                                                                  </rows>'
                                                                                                                         
                                                                                                                        SELECT
                                                                                                                         Art.SortKey,
                                                                                                                         T.Price
                                                                                                                        FROM
                                                                                                                        (select b.value('@id' , 'int') [SortKey], b.value('.' , 'varchar(50)') [ArtNo]
                                                                                                                        from @xml.nodes('/rows/row') a(b) )as Art
                                                                                                                        LEFT JOIN
                                                                                                                          SERVER.Catalog.Offer AS T ON
                                                                                                                            T.ArtNo = Art.ArtNo
                                                                                                                        ORDER BY
                                                                                                                        Art.SortKey


                                                                                                                        То что нужно!!! Работает ура!!))) Очень благодарен!
                                                                                                                          Цитата TravNik @
                                                                                                                          Я только начал SQL изучать. От моего языка он отличается синтаксисом, построением, логикой. Для меня это темный лес. Не думайте что я ленивый, если бы я хоть чуть разбирался в SQL я наверняка бы сделал сам, но к сожалению не могу. Я понимаю что вы тут друг с другом привыкли общаться на равных, но я нуб.

                                                                                                                          Ты эта, сам попроще. Тут все нубы в том или ином смысле. Вон даже не представляют, что то, что в синтаксисе одного сервера работает "на ура" другой может не воспринимать от слова "совсем" ;)

                                                                                                                          Подумать - я не над не тонкостями языка просил, а именно подумать. Тут простая логика надо. ;) Кирпичики были просто оставалось собрать из них целое. Специально чуть выше расписал тебе.

                                                                                                                          Добавлено
                                                                                                                          TravNik И еще раз подумай про свою БД рядом, со своими данными, структурами и прочей радостью, которых нет в проставке от "вендора"
                                                                                                                          Жить станет на порядки проще и веселей.
                                                                                                                          Файл "данных" на клиенте это конфиги для доступа и инишки с настройкаи клиента "под себя". Все. Конфин не пролюдбишь, тбо без него просто не стартуешь, а инишку потерял и не заметил. Ну настроет юзверь еще раз цвет кнопочек как любит, руки не отсохнут, программа работать не перестанет.
                                                                                                                          С данными другой коленкор. Они должны быть на сервере ;)
                                                                                                                            Скрытый текст
                                                                                                                            Цитата Павел Калугин @
                                                                                                                            Жаль в рейтинг тебе минусов наляпать не могу...

                                                                                                                            Не парься. Давай представим, что ты мне "наляпал" в рейтинг 50 минусов. Естественно, я очень огорчился. А как иначе ... Надеюсь тебе стало немножко веселее? :lol:
                                                                                                                              Фух, сделал... В итоге загрузка уменьшилась кардинально - с 30 сек до 1.5 сек. Еще раз всем спасибо!

                                                                                                                              Цитата Павел Калугин @
                                                                                                                              Жаль в рейтинг тебе минусов наляпать не могу...

                                                                                                                              Всем ДРУЖБЫ!!! И ДОБРА!!! ;)
                                                                                                                                JoeUser злой я вчерась был. Очередные бизнестребования третий раз на доработку завернул.

                                                                                                                                TravNik еще раз очень внимательно подумай над идеей второй БД. Такой простенький список строить так долго это просто ужасть какой-то.
                                                                                                                                Еще раз повторю. У тебя есть сервер MSSQL. На нем лежит база с данными "от поставщика". Ну и флаг ей в руки пусть лежит неприкосновенная. Создаешь на том же сервере новую базу данных. И в ней хранишь всё необходимое тебе. В ней делаешь свои процедуры. И радуешься. ;)
                                                                                                                                Сообщение отредактировано: Павел Калугин -
                                                                                                                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                                                                                0 пользователей:


                                                                                                                                Рейтинг@Mail.ru
                                                                                                                                [ Script execution time: 0,1628 ]   [ 15 queries used ]   [ Generated: 6.05.24, 03:46 GMT ]