Создать таблицу из результатов запроса сервера, связанного с SQL > 8000 символов

#sql #tsql #linked-server #select-into

#sql #tsql #связанный сервер #выберите-в

Вопрос:

Я пытаюсь создать таблицу на сервере SQL на основе результатов Oracle SQL > 8 тыс. символов. Возможно ли это без openquery, который имеет это ограничение в 8 кб.

Вот что я пытаюсь сделать, но, похоже, не могу заставить это работать:

 SELECT * INTO #TMP001 EXEC ('select trunc(sysdate) curr_day from dual') AT LinkedServerN
  

Выдает ошибку:

Имя объекта или столбца отсутствует или пустое. Для операторов SELECT INTO убедитесь, что у каждого столбца есть имя. Для других операторов ищите пустые псевдонимы. Псевдонимы, определенные как «» или [], не допускаются. Измените псевдоним на допустимое имя.

Любая помощь будет оценена.

Спасибо,

Ответ №1:

Создайте таблицу результатов, даже если она временная. После этого используйте insert into вместо select * into .

Ответ №2:

Добрый день, Ди,

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

«OPENROWSET (BULK …) предполагает, что, если не указано, максимальная длина данных SQLCHAR, SQLNCHAR или SQLBINARY не превышает 8000 байт».

Когда вы используете OPENROWSET для данных из таблицы SQL Server с использованием поставщика SQLNCLI, вы можете использовать его непосредственно в таблицах с типом столбца MAX.

Когда вы используете внешний файл для данных, решение состоит в том, чтобы просто использовать файл формата, который определяет максимальную длину столбца.

К сожалению, я не уверен, как это работает с Oracle, поскольку я не тестировал это.

Вот полный пример использования SQL Server в качестве источника с использованием столбца MAX

 use tempdb
GO

sp_configure 'show advanced options', 1;  
RECONFIGURE;
GO 
sp_configure 'Ad Hoc Distributed Queries', 1;  
RECONFIGURE;  
GO  

DROP TABLE IF EXISTS T
GO
CREATE TABLE T (MaxText NVARCHAR(MAX))
GO

TRUNCATE TABLE T;   
INSERT T(MaxText) VALUES ('Ronen')
GO
DECLARE @T NVARCHAR(MAX) = 
    CONVERT(NVARCHAR(MAX),'')
      REPLICATE(N'Ronen', 1600) -- 8k
      REPLICATE(N'Ronen', 1600) -- 8k   
      REPLICATE(N'Ronen', 1600) -- 8k   
INSERT T(MaxText) VALUES (@T)
GO

SELECT DATALENGTH(MaxText) -- 24000
FROM tempdb.dbo.T
GO

SELECT DATALENGTH(MaxText) 
FROM OPENROWSET(
    'SQLNCLI',
    'Server=LectureVMSQL2019;Trusted_Connection=yes;', 
    'SELECT MaxText FROM tempdb.dbo.T') AS a;
GO -- 24000 returned from the OPENROWSET

SELECT * INTO #TMP001 
FROM OPENROWSET(
    'SQLNCLI',
    'Server=LectureVMSQL2019;Trusted_Connection=yes;', 
    'SELECT MaxText FROM tempdb.dbo.T') AS a;
-- (2 rows affected)
SELECT DATALENGTH(MaxText) FROM #TMP001
GO -- 24000
  

Если это не работает в Oracle, то:

  1. Вы можете использовать SINGLE_CLOB или SINGLE_NCLOB, которые вернут данные в виде одного значения максимальной длины, а затем вы сможете проанализировать данные

  2. Вариант 2 — экспортировать в csv, и, как я объяснил выше, вы можете импортировать с помощью bcp или OPENROWSET, используя файл формата

  3. Кроме того, проверьте этот поток в MSDN о том, как я использую связанный сервер