TSQL转PostgreSQL时报错syntax error at or near "[" 怎么解决?
TSQL转PostgreSQL语法报错解决方法
错误根因
触发语法报错的核心原因是直接沿用了SQL Server专属的TSQL语法,PostgreSQL不支持这两类写法:
- 方括号
[]标识符包裹:TSQL用[库名].[schema名].[表名]的格式限定表的归属层级,PostgreSQL如果需要转义标识符(比如大小写敏感、含特殊字符)需使用双引号"",无特殊需求可直接去掉方括号编写标识符。 (nolock)表提示:这是TSQL专属的脏读(读未提交)提示,PostgreSQL不支持直接在表名后加该参数。
正确修改后的SQL
场景1:表名、字段名无大小写敏感要求(常规场景)
直接删除方括号和nolock参数即可:
select v.ASSET_NUM, v.SERIAL_NUM, xm.NAME, xm.* from SiebelDB.dbo.S_ASSET v inner join SiebelDB.dbo.S_ASSET_XM xm on xm.PAR_ROW_ID = v.ROW_ID where xm.TYPE = 'Service Plan' and xm.NAME like 'G3%'
如果当前连接的数据库就是SiebelDB、默认schema为dbo,还可以进一步简化前缀,直接写表名即可:
select v.ASSET_NUM, v.SERIAL_NUM, xm.NAME, xm.* from S_ASSET v inner join S_ASSET_XM xm on xm.PAR_ROW_ID = v.ROW_ID where xm.TYPE = 'Service Plan' and xm.NAME like 'G3%'
场景2:表、字段建表时指定了大小写敏感
将所有需要保留大小写的标识符用双引号包裹即可:
select v."ASSET_NUM", v."SERIAL_NUM", xm."NAME", xm.* from "SiebelDB"."dbo"."S_ASSET" v inner join "SiebelDB"."dbo"."S_ASSET_XM" xm on xm."PAR_ROW_ID" = v."ROW_ID" where xm."TYPE" = 'Service Plan' and xm."NAME" like 'G3%'
原nolock参数等效实现
如果需要保留TSQL中nolock对应的读未提交隔离级别效果,执行上述SQL前先运行以下语句即可:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
内容的提问来源于stack exchange,提问作者rae6846
相关产品推荐
相关产品推荐

