SQL Server: OPENQUERY в простых словах (с примером) - PullRequest
0 голосов
/ 02 июля 2019

Я довольно новичок в SQL Server, и я наткнулся на это прямо здесь:

BEGIN TRANSACTION loadTTAllocations

    INSERT INTO @ttaAllocs
        SELECT 
            company_code AS CompanyId,
            job_number AS JobNo,
            ...
            is_blocked AS IsBlocked
        FROM 
            OPENQUERY([SRV_TimeTac], 
                       'SELECT DISTINCT 
                            job.individual_value_1 AS job_number,
                            job.individual_value_3 AS company_code,
                            ...
                            now() AS queryTimeStamp
                        FROM 
                            pm_altran.pm_tasks_subprojects AS taskCode
                        INNER JOIN 
                            pm_altran.pm_tasks_subprojects AS job
                                 ON job.id = taskCode.mother_id 
                                 AND job.is_done = 0
                                 AND NOT job.is_blocked
                        INNER JOIN 
                            pm_node_to_user AS n2u
                                 ON n2u.node_id = taskCode.id
                                 AND n2u.access = 1
                                 AND n2u.is_todo = 1
                        LEFT JOIN 
                            altran_pm_user_user_settings AS u
                                 ON u.administrators_id = n2u.user_id
                        WHERE 
                            taskCode.object_type = ''task''
                            AND taskCode.is_paid_non_working = 0
                            AND taskCode.id > 50');

    SET @rowCount = @@ROWCOUNT

    SET @eventDetails = 'End loadTTAllocations: ' + CAST(@rowCount as VARCHAR(10)) + ' rows affected';

    COMMIT TRANSACTION loadTTAllocations

Проблема в OPENQUERY.

Что я понимаю из документации, так это то, что это запрос только на другом сервере.В этом случае SRV_TimeTac?

Итак, в этом примере мы запрашиваем другой сервер с именем «SRV_TimeTac» и возвращаем результаты для окончательной загрузки в временную таблицу с именем @ttaAllocs.

Это правильно?

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 02 июля 2019

OPENQUERY (Transact-SQL) :

Выполняет указанный сквозной запрос на указанном связанном сервере.Этот сервер является источником данных OLE DB.На OPENQUERY можно ссылаться в предложении FROM запроса, как если бы это было имя таблицы.На OPENQUERY также можно ссылаться как на целевую таблицу оператора INSERT, UPDATE или DELETE.Это зависит от возможностей поставщика OLE DB.Хотя запрос может возвращать несколько наборов результатов, OPENQUERY возвращает только первый.

Аргументы

connected_server Идентификатор, представляющий имя связанного сервера.

'query' Строка запроса выполняется на связанном сервере.Максимальная длина строки составляет 8 КБ.

Итак, чтобы ответить на ваш вопрос, да, это то, что делает ваш запрос.Значение connected_server в вашем случае равно SRV_TimeTac, а значение 'query' является вашей длинной литеральной строкой.Значение 'query' запускается на связанном сервере, и набор результатов возвращается на сервер, на котором вы запускали OPENQUERY.Затем этот набор результатов вставляется в переменную @ttaAllocs.

Интересно, тогда COMMIT транзакция, которую вы начали до INSERT, что кажется странным, если учесть, что вы только вставили значение в переменную и не сделалине влияет на любые сохраняемые объекты.Переменная Таблицы вполне могла в конечном итоге быть записана на диск, а не сохранена в Памяти, если она стала достаточно большой, но тогда вы, скорее всего, сделаете транзакцию на tempdb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...