【问题标题】:Create table from results of >8000 char SQL Linked Server query从 >8000 字符 SQL 链接服务器查询的结果创建表
【发布时间】:2023-03-12 06:49:01
【问题描述】:

我正在尝试根据 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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      早安,迪,

      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 中不起作用,那么:

      1. 您可以使用 SINGLE_CLOB 或 SINGLE_NCLOB 将数据作为单个值返回,长度为 MAX,然后您可以解析数据

      2. 选项 2 是导出到 csv,正如我上面解释的,您可以使用 bcp 或使用格式文件的 OPENROWSET 导入

      3. 另外查看this thread on MSDN关于tio如何使用链接服务器

      【讨论】:

        猜你喜欢
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 2019-04-29
        相关资源
        最近更新 更多