Организация хранилища файлов внутри базы данных 1C+MS-SQL
Довольно часто в различных вариантах учетных задач возникает проблема размещения различной информации (файлов) с привязкой их к базе данных. Например, построение на базе 1С системы учета документооборота с хранением файлов в формате Word , Excel . Если организовывать такое хранилище в виде каталогов файлов, то очень велика вероятность нарушения работы системы в результате ряда факторов, вызванных, как правило, неумелыми, либо наоборот, «слишком умелыми» действиями пользователя. Другими словами система хранения файлов в каталоге базы 1С , ввиду своей общедоступности является существенной прорехой в безопасности. Файлы легко переименовать, перезаписать, испортить или удалить.
Таким образом, мы постепенно подходим к мысли хранения файлов непосредственно в базе данных MS SQL . Остается вопрос, каким образом всё это можно организовать? В своей статье, я постараюсь дать как можно более подробный ответ на этот вопрос. Все исследования будут происходить на платформе MS SQL 2000 , далее просто SQL .
Итак, первый вопрос на повестке дня – создание таблицы для хранения файлов. Как известно, SQL позволяет создавать таблицы, содержащие поля с типом IMAGE (в переводе на русский «образ»). В поле такого типа мы и будем хранить свой файл. Для обеспечения уникальности данных и возможности в дальнейшем получения доступа к файлу нам необходимо создать колонку с типом int , которая у нас будет иметь свойство « Identity ». Это свойство обеспечит нам автоматическую нумерацию строк таблицы средствами SQL . Первоначальный номер у нас будет выставлен в « 1 », приращение номера будет тоже идти по « 1 ».
Второй вопрос на повестке дня, – в какой базе создавать таблицу? Требуется ли для ее хранения отдельная база данных, или можно воспользоваться уже существующей базой данной 1С . Как показали опыты, 1С при операциях, затрагивающих базу данных, таких как выгрузка, загрузка, реструктуризация, работает только со «своими» таблицами не затрагивая те, которые отсутствуют в ее файле DDS . Это дает нам возможность поместить нашу таблицу непосредственно в базе данных 1С . При этом, однако, следует иметь в виду, что раз 1С не трогает «не свои» таблицы, то при выгрузке данных наша таблица выгружаться не будет. Поэтому, для обеспечения резервного копирования или переноса данных придется использовать средства SQL . С другой стороны, если мы помещаем нашу таблицу в отдельную базу данных, то получаем более гибкие возможности работы, в частности легче можно будет наладить репликацию данной таблицы, что немаловажно. В моем примере таблица будет расположена непосредственно в базе данных 1С .
Теперь нам остается создать необходимый скрипт. Сразу определимся, что работать с хранимыми в базе данных файлами мы будем с использованием технологии ADO . Отсюда вытекает необходимость работы в нормальном рабочем режиме только в разделенном режиме работы 1С -Предприятия, так как в монопольном соединение ADO не сможет получить доступ к базе данных.
Сделаем так, чтобы процедура проверки наличия необходимой таблицы в базе данных запускалась в из процедуры ПриНачалеРаботыСистемы () когда режим работы пользователя разделенный. Текст процедуры можно посмотреть здесь.
Теперь у нас есть в базе необходимая таблица. Следующая задача — научиться записывать в нее необходимые данные. Для этого мы воспользуемся такой возможностью SQL-сервера , как « BULK » операции. Это операции манипулирования большими объемами данных, точнее сказать это операции обмена данными между SQL-сервером и файлом определенной структуры, который может содержать как одну строку данных для SQL-сервера , так и большое их количество. Определение структуры данных, содержащихся в файле, происходит с помощью специального файла-формы.
Итак, мы определлись, что будем записывать файл в базу данных с помощью операции « BULK INSERT ». В процедуре записи файла в базу данных, мы должны выполнить следующие действия:
- получить последний номер строки и сохранить его в переменной;
- создать и заполнить содержимым файл формы;
- выполнить архивацию исходного файла для уменьшения его объема на сервере (не обязательно — у меня делается ввиду большого объема данных);
- создать файл исходных данных;
- выполнить запрос на размещение на сервере;
- получить последний номер строки и сравнить его с сохраненным ранее значением;
- если номер увеличился на «1» — значит операция прошла успешно, иначе — была ошибка.
Важное примечание: так как результирующий запрос будет выполнять сервер, необходимо, чтобы файлы, используемые сервером были доступны для него. Соответственно, при формировании путей к файлам мы должны «смотреть на них» со стороны сервера. То есть, получив запрос на размещение файла «C:myfile.doc» сервер будет искать его именно на своем диске, а не на компьютере-клиенте. Лучше всего сохранять файлы в сетевых папках доступных серверу и сразу указывать сетевые пути .
Текст процедуры глобального модуля осуществляющей размещение файла в таблице базы данных SQL можно посмотреть здесь.
Следующий вопрос, который нам предстоит решить — каким образом можно извлечь файл из базы данных. Тут дело обстоит сложнее. Придется воспользоваться утилитой BCP , входящей в состав поставки MS SQL сервера . Эта утилита служит для пакетного обмена данными с SQL сервером . В принципе, мы могли бы воспользоваться этой утилитой и для загрузки файла на сервер, но, думается, что, чем меньше будет мелькать дополнительных окошек, тем лучше. Принцип использования утилиты такой же как у команды « BULK INSERT », с тем различием, что нам нужно получить данные с сервера, а не загрузить на него.
Таки образом список действий, который нам надо выполнить становится намного короче:
- создать файл формы;
- выполнить утилиту BCP с параметрами;
- разархивировать полученный файл (если использовалось архивирование).
Функцию глобального модуля, служащую для извлечения файла с сервера можно посмотреть здесь.
PostgreSQL | Как сохранить данные одного столбца таблицы на ПК?
Как сделать SQL-дамп данных одного столбца таблицы PostgreSQL на ПК в отдельный файл?
У нас есть таблица с несколькими столбцами и несколькими записями. Мы хотим сохранить на компьютер данные только из одного столбца этой таблицы, чтобы у нас получился файл с расширением «.sql«.
Этот файл нам нужен для хранения наиболее важной части информации из таблицы. Такой файл не хранит индексы таблицы и так как он текстовый, то его можно будет легко сжать архиватором и передать куда-то ещё. Как это сделать?
Вкратце план действий такой:
- Создаём новую таблицу на основании запроса выборки (через интерфейс pgAdmin4 или через терминальный клиент psql)
- Переходим к терминал операционной системы, где установлен PostgreSQL
- Используем команду сохранения — pg_dump
- Копируем файл выгрузки в нужное место
- Удаляем созданную ранее таблицу
SQL-запрос на получение только одного столбца таблицы PostgreSQL
Такой командой мы получаем все столбцы таблицы:
SELECT * FROM filter.t_baddlevel2;
В моём случае нужно использовать уточнение для столбца « baddname » (хранит плохие мусорные домены второго уровня сети интернет):
SELECT baddname FROM filter.t_baddlevel2;
Результат вызова в веб-интерфейсе pgAdmin4:
Сперва мы должны знать, что именно мы хотим получить. Делаем запрос на выборку данных и убеждаемся, что всё правильно. У нас получилось 36188 записей имён доменов второго уровня, которые нужны для фильтрации новых адресов для базы данных.
Создание новой таблицы на основании запроса SELECT в PostgreSQL
Команда SELECT по факту возвращает нам новую таблицу, пусть даже с одним столбцом. Это значит, что мы можем из нашего запроса создать отдельную таблицу.
CREATE TABLE filter.t_baddname_temp AS SELECT baddname FROM filter.t_baddlevel2;
При помощи команды CREATE TABLE AS мы создаём новую таблицу с именем « t_baddname_temp » в схеме данных « filter «.

Проверяем, что все данные перенеслись корректно.
SELECT * FROM filter.t_baddname_temp;
Если в новой таблице будут не те данные, то эту таблицу-клон можно будет просто удалить.
DROP TABLE filter.t_baddname_temp;
Использование консольной утилиты pg_dump для сохранения данных новой таблицы из PostgreSQL на компьютер в операционную систему — в файл
К этому моменту у нас уже есть нужная таблица для сохранения. Теперь мы должны подключиться к удалённому хосту на котором обслуживается PostgreSQL. Для этого нужно знать логин и пароль для входа в ОС, а также логин и пароль пользователя, от имени которого будет выполняться сохранение данных из СУБД.
В общем нужно знать две учётные записи.
В терминале операционной системы (например, Debian) под правильным пользователем нужно ввести команду:
pg_dump -t 'filter.t_baddname_temp' sdb > filter.t_baddlevel2-2023-01-19.sql
После выполнения, файл будет сохранён в директорию « /var/lib/postgresql «.

Если вы захотите сменить путь сохранения, то имейте ввиду, что вашему пользователю PostgreSQL может быть отказано в доступе для сохранения в нужный вам путь в ОС. Болванка файла сможет появиться, но он будет пустой.
Просмотр файла для проверки сохранения
Открываем наш файл в любом текстовом редакторе и смотрим.

Начальная часть файла будет содержать важную для PostgreSQL информацию о состоянии таблицы. После этого последуют сами данные:

Теперь можно удалить временную таблицу.
Информационные ссылки
Официальный сайт PostgreSQL — https://www.postgresql.org
Графический веб-интерфейс pgAdmin для управления СУБД PostgreSQL — https://www.pgadmin.org
Синтаксис SQL-команды SELECT на русском языке — https://postgrespro.ru/docs/postgresql/15/sql-select
Синтаксис SQL-команды COPY на русском языке — https://postgrespro.ru/docs/postgresql/15/sql-copy
Операционная система Debian — https://www.debian.org
Вам также может понравиться

Опубликовано 21.12.2022
PostgreSQL | Как получить предыдущее значение существующего идентификатора?
Как получить предыдущую запись таблицы по предполагаемому первичному ключу? Суть проблемы заключается в том, что при использовании генераторов последовательностей SEQUENCE, можно получать […]

Опубликовано 13.07.2023
PostgreSQL | Как подменять NULL-значение при выборке данных через SELECT?
NULL-значения, которые база данных отдаёт на клиент могут не представлять никакой ценности для конечного пользователя. В большинстве случаев от них нужно избавляться. […]

Опубликовано 18.10.2022
PostgreSQL | Как получить одну случайную запись из таблицы?
Решение № 1 — Через сортировку всей таблицы и функцию RANDOM() в PostgreSQL Это самый простой в понимании вариант, но самый медленный. Команда […]

Опубликовано 01.10.2022
PostgreSQL | Как получить первые два символа из строки данных?
В PostgreSQL есть специальные встроенные строковые функции, при помощи которых можно работать со строковыми типами данных, например с типом text. Нужна для […]
Экспорт данных в базу данных SQL с помощью хранимой процедуры
Мне нужно записывать данные в базу данных SQL с использованием хранимой процедуры, поскольку мне нужно выполнять дополнительные проверки перед записью данных.
Что такое хранимая процедура:
Хранимая процедура (stored procedure или stored proc) — это функция на сервере, которая обеспечивает особый доступ для приложений к базе данных SQL. Такие процедуры выполняются и обрабатывают данные на стороне сервера.
Когда может потребовать хранимая процедура:
- Обработка данных на стороне сервера.
- Запись данных в несколько таблиц.
- Добавление первичных или дополнительных ключей к записываемым данным.
- Обновление или запись данных по дополнительным условиям.
Требования:
- Advanced OPC Data Logger Professional, Enterprise, или пробная версия;
- SQL Database Professional
Подразумевается что:
У вас уже настроен парсер и подготовлены переменные парсера для экспорта.
Для этого примера переменные парсера взяты из предыдущего примера.
Также вы можете просмотреть другие примеры парсинга данных (разные типы парсеров)
Решение:
Замечание: Вам потребуются знания языка программирования SQL для вашей базы данных, поскольку хранимая процедура это код программы для сервера.
Будем считать, что у вас есть доступ к базе данных и права для создания объектов в ней. Прежде всего, создайте таблицу в базе данных для сохранения входящих данных. Выберите существующую базу данных, или создайте новую для тестирования. Самый простой способ — использовать инструменты разработчика, предоставляемые производителем базы:
- SQL Server Management Studio для MSSQL.
- MySQL Workbench для MySQL.
- pgAdmin для PostgreSQL.
Обратитесь к документации на соответствующий игструмент для дополнительной информации.
Мы подготовили пример таблицы (рис. 1). Это прототип. Вы можете изменить его по своим требованиям или использовать вашу существующую таблицу.
MS SQL Server
CREATE TABLE dbo.[DATA] ( [ID] decimal(10,0) IDENTITY(1,1) NOT NULL, [DATE_TIME_STAMP] datetime NULL, [DATA_SOURCE_NAME] nvarchar(32) NULL, [DEVICE_ID] nvarchar(32) NULL, [V1] real NULL, [V2] real NULL, [V3] real NULL, CONSTRAINT [PK_DATA] PRIMARY KEY ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]
MySQL
CREATE TABLE `DATA` ( `ID` int(11) NOT NULL auto_increment, `DATE_TIME_STAMP` DATETIME NULL, `DATA_SOURCE_NAME` VARCHAR(32) NULL, `DEVICE_ID` VARCHAR(32) NULL, `V1` DOUBLE NULL, `V2` DOUBLE NULL, `V3` DOUBLE NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB;
PostgreSQL
CREATE TABLE "DATA" ( "ID" SERIAL, "DATE_TIME_STAMP" timestamp DEFAULT NULL, "DATA_SOURCE_NAME" varchar(32) DEFAULT NULL, "DEVICE_ID" varchar(32) DEFAULT NULL, "V1" real DEFAULT NULL, "V2" real DEFAULT NULL, "V3" real DEFAULT NULL, PRIMARY KEY (ID) );
Подготовьте хранимую процедуру в базе данных и выдайте права «Execute» для пользователя. Следующий пример демонстрирует хранимую процедуру, которая проверяет входящие данные и записывает их в таблицу.
MS SQL Server
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'data_insert') DROP PROCEDURE data_insert GO CREATE PROCEDURE [dbo].[data_insert] @DATE_TIME_STAMP datetime, @DATA_SOURCE_NAME nvarchar(32), @DEVICE_ID nvarchar(32), @V1 float, @V2 float, @V3 float WITH EXECUTE AS OWNER AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; IF (@V1 > 100) OR (@V2 > 100) OR (@V3 > 100) BEGIN RETURN; END; UPDATE DATA SET DATE_TIME_STAMP = @DATE_TIME_STAMP, V1 = @V1, V2 = @V2, V3 = @V3 WHERE DATA_SOURCE_NAME = @DATA_SOURCE_NAME AND DEVICE_ID = @DEVICE_ID; END; GO
MySQL
DROP PROCEDURE IF EXISTS `data_insert`; CREATE PROCEDURE `data_insert`( IN `DATE_TIME_STAMP` DATETIME, IN `DATA_SOURCE_NAME` VARCHAR(32), IN `DEVICE_ID` VARCHAR(32), IN `V1` DOUBLE, IN `V2` DOUBLE, IN `V3` DOUBLE) BEGIN SET @DATE_TIME_STAMP = DATE_TIME_STAMP; SET @DATA_SOURCE_NAME = DATA_SOURCE_NAME; SET @DEVICE_ID = DEVICE_ID; SET @V1 = V1; SET @V2 = V2; SET @V3 = V3; IF (@V1
PostgreSQL
CREATE OR REPLACE FUNCTION data_insert( IN DATE_TIME_STAMP_1 timestamp, IN DATA_SOURCE_NAME_1 varchar(32), IN DEVICE_ID_1 varchar(32), IN V1_1 real, IN V2_1 real, IN V3_1 real) RETURNS void SECURITY DEFINER AS $$ BEGIN IF (V1_1 > 100) OR (V2_1 > 100) OR (V3_1 > 100) THEN RETURN; END IF; UPDATE DATA SET DATE_TIME_STAMP = DATE_TIME_STAMP_1, V1 = V1_1, V2 = V2_1, V3 = V3_1 WHERE DATA_SOURCE_NAME = DATA_SOURCE_NAME_1 AND DEVICE_ID = DEVICE_ID_1; END; $$ LANGUAGE plpgsql; -- split line
Выберите и настройте модуль экспорта данных "SQL Database Professional" для вызова хранимой процедуры на вашем сервере (рис. 1).

Рис. 1. Выбор модуля SQL Database.
Перейдите в окно настройки модуля "SQL Database Professional" и выберите страницу "Режим соединения" на левой панели (рис. 2)

Рис. 2. Модуль SQL Database. Активация подключения.
- Отключите опцию "Временно отключено" (поз. 1).
- Опция №2 указывает программе всегда поддерживать активное соединение с базой данных. Это увеличивает производительность при большом потоке данных.
- Опция №3 активирует режим автоматического переподключения к базе при потере связи с ней.
На второй странице "Параметры соединения" (рис. 3) вы можете выбрать тип базы данных и настроить параметры подключения к ней. Обратитесь к руководству по модулю SQL Database для подробных разъяснений. Вы должны успешно протестировать подключение к базе кликнув на кнопке "Проверить связь" (поз. 2), перед тем как переходить к следующему шагу.

Рис. 3. Параметры соединения.
На третьей странице "Обработка ошибок" (рис. 4) выберите как программа должна реагировать на ошибки, возникающие при записи данных в БД.

Рис. 5. Обработка ошибок.
Опция №2 позволяет активировать запись во временный файл, когда база данных не доступна. А затем восстановить данные из файла, когда удастся подключиться к базе данных снова.
7. Последняя страница "Очередь SQL" (рис. 6) очень важна. Вы должны добавить SQL запрос и связать параметры SQL запроса и переменные парсера.

Рис. 7. Очередь SQL.
Для добавления SQL запроса в очередь кликните на кнопке "Действие → Добавить SQL в очередь" (рис. 7, поз. #2), а затем укажите текст SQL запроса в SQL редакторе (рис. 8) кликнув на поле "Текст SQL", а затем на кнопке с точками в нем (рис. 7).

Рис. 8. SQL редактор.
Укажите текст SQL запроса для вызова хранимой процедуры в соответствии с синтаксисом языка SQL вашей базы данных. Параметры вида ":TIMESTAMP" или ":V1" позволяют передать значение переменной парсера в SQL запрос, и далее в базу. Каждый параметр затем появляется в очереди (рис. 7), где вы должны указать тип данных ( поле Тип данных) и привязать переменную парсера (поле Имя переменной парсера). Тип данных должен соответствовать типу данных соответствующего параметра вашей хранимой процедуры. Оба типа данных должны соответствовать типу данных значения переменной парсера.
MS SQL Server
exec data_insert :TIMESTAMP, :DS_NAME, :DEVICE_ID, :V1, :V2, :V3
MySQL
call data_insert(:timestamp, :ds_name, :device_id, :v1, :v2, :v3);
PostgreSQL
select data_insert(:timestamp, :ds_name, :device_id, :v1, :v2, :v3);
Кликните на кнопке "OK" для того чтобы закрыть все диалоговые окна и сохранить все настройки.
Если модуль SQL Database Professional настроен правильно, то в главном окне программы будут отображаться сообщения об успешной записи данных в БД.
Частые вопросы
Как много параметров может быть у хранимой процедуры?
Количество зависит от типа и версии базы данных SQL. Оптимальный максимум - это 64 параметра.
Тип данных параметра моей хранимой процедуры не точно совпадает с типом данных значения. Именно такого типа данных нет в вашем списке. Что делать?
Модуль может автоматически преобразовывать близкие типы данных. Например, целые числа с разной точностью и разрядностью (возможна потеря точности), целые числа в вещественные, любые числа в строку.
Сопутствующие статьи:
- Экспорт данных в Microsoft SQL Server 2014-2022 с помощью модуля "ODBC Database" Модули: ODBC Database, ASCII data parser and query, DDE server
- Экспорт данных в базу данных MySQL с помощью модуля "SQL Database Professional" Модули: SQL Database Professional, ASCII data parser and query, DDE server, Aggregator, ODBC database
- Экспорт данных в базу данных с помощью хранимой процедуры Модули: SQL Database Professional
- Запись данных в Microsoft Access с помощью модуля "ODBC Database" Модули: ODBC Database, ASCII data parser and query, DDE server
Как сохранить результат хранимой процедуры в таблице? — Microsoft SQL Server
Сегодня в материале мы с Вами рассмотрим несколько способов реализации того, как можно в Microsoft SQL Server сохранить результат выполнения хранимой процедуры в таблице в тех случаях, когда процедура возвращает табличные данные.

Это Вам может потребоваться, например, тогда когда нет возможности изменить код процедуры таким образом, чтобы непосредственно в самой процедуре осуществлялась вставка (INSERT) данных, которые она возвращает, в нужную таблицу.
Если у Вас встала подобная задача сразу скажу, что универсального способа я не нашел, каждый из перечисленных способов ниже имеет свои недостатки, иными словами, какой использовать решать Вам.
Для начала давайте создадим тестовую хранимую процедуру, которая будет возвращать табличные данные. Все действия ниже я буду выполнять на Microsoft SQL Server 2016 Express, на текущий момент вышла уже 2017 версия SQL Server, о том, что нового в ней появилось, можете почитать в материале – «Обзор основных нововведений в Microsoft SQL Server 2017».
Создание хранимой процедуры, которая возвращает табличные данные
Для примера давайте напишем простую процедуру, которая будет возвращать небольшую таблицу, состоящую всего из трех столбцов, данную таблицу я сформирую с помощью конструктора табличных значений. Для создания процедуры запускаем следующую инструкцию.
CREATE PROCEDURE sp_Test AS SELECT * FROM (VALUES (1, 'Компьютер', 500), (2, 'Принтер', 300), (3, 'Монитор', 300) ) AS TmpTable (ProductId, ProductName, Summa) GO EXEC sp_Test

Как видите, процедура создана и возвращает табличные данные.
Способ 1 – Используем вызов процедуры в конструкции INSERT INTO
Инструкция INSERT позволяет в качестве источника указывать вызов хранимой процедуры, но у данного способа есть один очень существенный недостаток, таблица, в которую Вы хотите сохранить данные, должна уже существовать, т.е. Вы заранее должны знать количество и тип данных возвращающихся столбцов, для того чтобы создать соответствующую таблицу.
В следующем примере мы создадим временную таблицу, выполним инструкцию INSERT, в которой в качестве источника будет выступать вызов хранимой процедуры.
--Создаем временную таблицу CREATE TABLE #TmpTable (ProductId INT, ProductName VARCHAR (30), Summa MONEY); --Осуществляем вставку INSERT INTO #TmpTable EXEC sp_Test --Проверяем, т.е. делаем выборку из таблицы SELECT * FROM #TmpTable --Удаляем временную таблицу DROP TABLE #TmpTable

Способ 2 – Используем связанный сервер
В данном случае мы создаем связанный сервер, который будет ссылаться на самого себя, иными словами, на текущий сервер. Затем с помощью конструкции OPENQUERY мы обращаемся к связанному серверу, запуская на нем соответствующую процедуру. Результат в данном случае мы можем сохранять уже с помощью конструкции SELECT INTO в новую таблицу (в нашем случае для примера во временную таблицу).
--Создаем связанный сервер EXEC sp_addlinkedserver @server = N'CurrentServer', @srvproduct = N'', @provider = N'SQLOLEDB', @datasrc = N'TESTSERVER\SQLEXPRESS' GO --Выполняем запрос с сохранением данных во временную таблицу SELECT * INTO #TmpTable FROM OPENQUERY(CurrentServer, 'SET FMTONLY OFF EXEC TestBase.dbo.sp_Test') --Проверяем полученные данные SELECT * FROM #TmpTable --Удаляем временную таблицу DROP TABLE #TmpTable

Плюс данного способа в том, что Вам уже не нужно заранее создавать таблицу и соответственно знать количество столбцов. Но, как Вы понимаете, у данного способа есть и недостатки, например, Вы должны для выполнения таких процедур предварительно создать связанный сервер, также данный способ не будет работать, если табличные данные не имеют названия колонок (например, SELECT 1, 2, 3) и если в хранимой процедуре используются временные таблицы.
Способ 3 – Используем конструкцию OPENROWSET
Этот способ подразумевает использование функции OPENROWSET и поставщика OLE DB. Для использования данного способа у Вас должен быть включен параметр Ad Hoc Distributed Queries.
--Включаем параметр Ad Hoc Distributed Queries EXEC sp_configure 'show advanced options', 1 RECONFIGURE EXEC sp_configure 'Ad Hoc Distributed Queries', 1 RECONFIGURE GO --Выполняем запрос с сохранением данных во временную таблицу SELECT * INTO #TmpTable FROM OPENROWSET('SQLOLEDB', 'Server=TESTSERVER\SQLEXPRESS;Trusted_Connection=Yes;', 'SET FMTONLY OFF EXEC TestBase.dbo.sp_Test') --Проверяем полученные данные SELECT * FROM #TmpTable --Удаляем временную таблицу DROP TABLE #TmpTable

Плюс этого способа в том, что Вам уже не нужно предварительно создавать ни таблицу, ни связанный сервер. Но, минусы все равное есть, конструкцию использовать не получится, если в хранимой процедуре используются временные таблицы или есть неименованные столбцы, и, как я уже сказал, предварительно нужно включить параметр «Ad Hoc Distributed Queries».
Заметка! Если Вас интересует SQL и T-SQL, рекомендую посмотреть мои видеокурсы по T-SQL, с помощью которых Вы «с нуля» научитесь работать с SQL и программировать с использованием языка T-SQL в Microsoft SQL Server.
У меня все, надеюсь, материал был Вам полезен, пока!
