Adoquery Params

отредактировано 01:48 Раздел: FastReport 4.0
Доброго времени суток, уважаемые участники форума!

Столкнулся с проблемой как передать в качестве параметра в ADOQuery1 результат ADOQuery2.

Т.е. необходимо передать в запрос параметр типа таблица.

Возможно ли это в FR, если да буду благодарен за любые советы.

Комментарии

  • отредактировано 01:48
    Результат типа "таблица" поддерживается только на уровне JOIN самим СУБД. Это во всех книжках по SQL написано.
    Возможно, получится обойтись без подобных ситуаций.
    Примеры запросов есть? Что получить надо.
  • отредактировано May 2014
    Nightmareterrible

    ADOQuery1:

    declare @t as table (s nvarchar(10))

    insert into table_server1 (ss)
    Select s from @t


    ADOQuery2:

    Select s from table_server2

    Что нужно сделать:

    Получить данные с table_server2 (SQL Server 2)
    и положить в table_server1 (SQL Server 1)


    SQL серверы, это 2 разных физических сервера несвязанных между собой.

    в ADOQuery params есть параметр типа DataSet, наводит на мысль что всё таки можно сделать то что мне нужно.
  • отредактировано 01:48
    Плохо работал с MSSQL на уровне переноса из одной базы в другую. Сам я работаю а Firebird, и уже давно знаю, что у этой СУБД прямых способов это сделать нету, потому и не разбирался.
    А вот у MS SQL эти способы есть.
    Я вам не помогу, но можете поискать в гугле или книжках.
    Например, http://www.sql.ru/forum/385607/import-eksp...noy-bd-v-druguu
  • отредактировано 01:48
    В Firebid я делаю так:
    Query1.Close;
    Query1.SQL.Text := 'Select * from Table1';
    Query1.Open;
    
    while not Query1.EOF do
    begin
      Query2.SQL.Add('Insert into Table2(<поля>) Values('+Query1.FieldByName('<поля>')+')');
      Query1.Next;
    end;
    Query2.ExecQuery; //Если запрос большой, его надо разбивать на мелкие.
    
  • отредактировано 01:48
    Nightmareterrible как на уровне SQL сделать это я знаю, не чего сложного.

    Меня интересует вопрос как в FR это сделать???

    Вариант с циклом не нравиться, не красиво как-то :) да и работает цикл значительно медленнее.

    Мне ведь надо не просто вставить данные из одной БД в другую. Передаваемые данные это параметры процедуры.

    Я не хочу вызывать процедуру в цикле для каждой записи. Я хочу процедуре отдать сразу всю таблицу.

    Или процедура выполнится 1000 раз обрабатывая по одной записи или 1 раз обработав 1000 записей.

    Хотелось более элегантного решения, но видимо этого решения нет, а жаль :)

  • PNPPNP
    отредактировано 01:48
    RAVen42 написал: »
    Nightmareterrible как на уровне SQL сделать это я знаю, не чего сложного.

    Меня интересует вопрос как в FR это сделать???

    Вариант с циклом не нравиться, не красиво как-то :) да и работает цикл значительно медленнее.

    Мне ведь надо не просто вставить данные из одной БД в другую. Передаваемые данные это параметры процедуры.

    Я не хочу вызывать процедуру в цикле для каждой записи. Я хочу процедуре отдать сразу всю таблицу.

    Или процедура выполнится 1000 раз обрабатывая по одной записи или 1 раз обработав 1000 записей.

    Хотелось более элегантного решения, но видимо этого решения нет, а жаль :)
    Оформить результат запроса в XML, этот XML передавать в процедуру второму серверу.
    Ну и см. Linked Server
  • отредактировано 01:48
    PNP Linked Server не подходит из соображений информационной безопасности.

    что-то в FR я не увидел параметра типа XML :)
  • PNPPNP
    отредактировано 01:48
    RAVen42 написал: »
    PNP Linked Server не подходит из соображений информационной безопасности.

    что-то в FR я не увидел параметра типа XML :)
    Я имею ввиду такой вариант:
    1) формируем выборку в виде XML:
    DECLARE @t TABLE (id INT, NAME NVARCHAR(50))
    INSERT @t
    SELECT 1,
           'one'
    UNION ALL
    SELECT 2,
           'two'
    DECLARE @XML NVARCHAR(MAX)
    SET @XML = (
            SELECT ID = test.id,
                   NAME = test.name
            FROM   @T Test
                   FOR XML AUTO,
                   ROOT('DATA')
        )
    
    SELECT @XML
    
    2) передаем на другой сервер резльтат выборки:
    CREATE PROCEDURE [dbo].[uspMyProc]
        @XML NVARCHAR(MAX)
    AS
    BEGIN
        SET NOCOUNT ON;
        
        DECLARE @XmlData XML
        SET @XmlData = @xml
        
        SELECT n.value('@ID', 'int'),
               n.value('@NAME', 'NVARCHAR(50)')
        FROM   @xmlData.nodes('//DATA/Test') r(n)
    END
    
  • отредактировано 01:48
    PNP Спасибо!!! Действительно вариант, что то не додумался до него :) .

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

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