#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, то:
-
Вы можете использовать SINGLE_CLOB или SINGLE_NCLOB, которые вернут данные в виде одного значения максимальной длины, а затем вы сможете проанализировать данные
-
Вариант 2 — экспортировать в csv, и, как я объяснил выше, вы можете импортировать с помощью bcp или OPENROWSET, используя файл формата
-
Кроме того, проверьте этот поток в MSDN о том, как я использую связанный сервер