早安,迪,
OPENROWSET 不限于 8000 个字符。 Please check this quote尤其是我加粗的部分:
“OPENROWSET(BULK...) 假设,如果未指定,SQLCHAR、SQLNCHAR 或 SQLBINARY 数据的最大长度不超过 8000 字节。”
当您使用提供程序 SQLNCLI 对 SQL Server 表中的数据使用 OPENROWSET 时,您可以直接在列类型为 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 中不起作用,那么:
您可以使用 SINGLE_CLOB 或 SINGLE_NCLOB 将数据作为单个值返回,长度为 MAX,然后您可以解析数据
选项 2 是导出到 csv,正如我上面解释的,您可以使用 bcp 或使用格式文件的 OPENROWSET 导入
另外查看this thread on MSDN关于tio如何使用链接服务器