从> 8000 char SQL Linked Server查询的结果创建表

问题描述 投票:0回答:2

我正在尝试根据Oracle SQL> 8k字符的结果在SQL Server上创建一个表。如果没有具有8k限制的openquery,这是否可行。

这是我想要做的但似乎无法让它工作:

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

投掷错误:

对象或列名称缺失或为空。对于SELECT INTO语句,请验证每列是否具有名称。对于其他语句,请查找空别名。不允许使用定义为“”或[]的别名。将别名更改为有效名称。

任何帮助,将不胜感激。

谢谢,

sql tsql linked-server select-into
2个回答
0
投票

创建结果表,即使它是临时的。在此之后使用insert into而不是select * into


0
投票

美好的一天Dee,

OPENROWSET不限于8000个字符。 Please check this quote特别是我粗体的部分:

“OPENROWSET(BULK ...)假定,如果未指定,则SQLCHAR,SQLNCHAR或SQLBINARY数据的最大长度不超过8000个字节。”

使用提供程序SQLNCLI对SQL Server表中的数据使用OPENROWSET时,可以直接在列类型为MAX的表上使用它。

当您使用外部文件作为数据时,解决方案只是使用格式文件,该文件将列的长度定义为MAX。

不幸的是,我不确定这是如何与Oracle合作的,因为我没有测试它。

以下是使用SQL 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. 另外检查qazxsw poi关于如何使用链接服务器
© www.soinside.com 2019 - 2024. All rights reserved.