Создайте таблицу из результатов запроса> 8000 символов SQL для связанного сервера - PullRequest
0 голосов
/ 06 апреля 2019

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

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

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

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

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

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

Спасибо,

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

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

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

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

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

Когда вы используете внешний файл для данных, тогда решение состоит в том, чтобы просто использовать файл формата, который определяет длину столбца для 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=LectureVM\SQL2019;Trusted_Connection=yes;', 
    'SELECT MaxText FROM tempdb.dbo.T') AS a;
GO -- 24000 returned from the OPENROWSET

SELECT * INTO #TMP001 
FROM OPENROWSET(
    'SQLNCLI',
    'Server=LectureVM\SQL2019;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, которые будут возвращать данные как одно значение, длина MAX, а затем вы можете анализировать данные

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

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

0 голосов
/ 06 апреля 2019

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

...