存储过程执行查询前报错(-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数据库的语法错误,根源在于两处对象命名不符合规则:
目标表命名错误
Teradata不支持数据库名.架构名.表名的三层命名格式,你写的FILMS.DBO.[T_DIM_FILMS]里的DBO是多余的,正确写法为FILMS.T_DIM_FILMS(前提是T_DIM_FILMS表位于FILMS数据库下)。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
相关产品推荐
相关产品推荐

