You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储过程执行查询前报错(-3706):DBO与.之间语法异常求助

存储过程报错(-3706)的解决方法

报错信息

(-3706) 语法错误:在单词'DBO'和'.'之间缺少预期内容

问题代码

CREATE PROCEDURE [dbo].[PS_DIM_FILMS]
AS
BEGIN
    INSERT INTO FILMS.DBO.[T_DIM_FILMS]
        SELECT *
        FROM OPENQUERY(linked_server,
          'SELECT 
            REG.CODE_FILMS, REG.NAME_FILMS, 
            DEP.CODE_SERIES, DEP.NAME_SERIES
           FROM SERV.DBO.T_FILMS REG
           INNER JOIN SERV.DBO.T_EXCEL_SERIES DEP 
           ON DEP.CODE_SERIES = REG.CODE_FILMS')
END

报错原因及修正方案

报错(-3706)是Teradata数据库的语法错误,根源在于两处对象命名不符合规则:

  1. 目标表命名错误
    Teradata不支持数据库名.架构名.表名的三层命名格式,你写的FILMS.DBO.[T_DIM_FILMS]里的DBO是多余的,正确写法为FILMS.T_DIM_FILMS(前提是T_DIM_FILMS表位于FILMS数据库下)。

  2. OPENQUERY内部远程表命名错误
    OPENQUERY已经通过第一个参数linked_server指定了远程服务器,所以内部SQL语句里不需要再添加远程服务器名SERV.:

  • 如果远程是SQL Server(支持dbo架构),直接写DBO.T_FILMS和DBO.T_EXCEL_SERIES;
  • 如果远程也是Teradata,直接写表名T_FILMS和T_EXCEL_SERIES(跨库的话写数据库名.表名)。

修正后的代码

远程为SQL Server的情况

CREATE PROCEDURE [dbo].[PS_DIM_FILMS]
AS
BEGIN
    INSERT INTO FILMS.T_DIM_FILMS
        SELECT *
        FROM OPENQUERY(linked_server,
          'SELECT 
            REG.CODE_FILMS, REG.NAME_FILMS, 
            DEP.CODE_SERIES, DEP.NAME_SERIES
           FROM DBO.T_FILMS REG
           INNER JOIN DBO.T_EXCEL_SERIES DEP 
           ON DEP.CODE_SERIES = REG.CODE_FILMS')
END

远程为Teradata的情况

CREATE PROCEDURE [dbo].[PS_DIM_FILMS]
AS
BEGIN
    INSERT INTO FILMS.T_DIM_FILMS
        SELECT *
        FROM OPENQUERY(linked_server,
          'SELECT 
            REG.CODE_FILMS, REG.NAME_FILMS, 
            DEP.CODE_SERIES, DEP.NAME_SERIES
           FROM T_FILMS REG
           INNER JOIN T_EXCEL_SERIES DEP 
           ON DEP.CODE_SERIES = REG.CODE_FILMS')
END

内容的提问来源于stack exchange,提问作者Ney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:05:33