我正在尝试根据Oracle SQL> 8k字符的结果在SQL Server上创建一个表。如果没有具有8k限制的openquery,这是否可行。
这是我想要做的但似乎无法让它工作:
SELECT * INTO #TMP001 EXEC ('select trunc(sysdate) curr_day from dual') AT LinkedServerN
投掷错误:
对象或列名称缺失或为空。对于SELECT INTO语句,请验证每列是否具有名称。对于其他语句,请查找空别名。不允许使用定义为“”或[]的别名。将别名更改为有效名称。
任何帮助,将不胜感激。
谢谢,
创建结果表,即使它是临时的。在此之后使用insert into
而不是select * into
。
美好的一天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中不起作用,那么: