将 TSQL 转换为 Postgresql - SQL 错误:错误:“[”处或附近的语法错误

Posted

技术标签:

【中文标题】将 TSQL 转换为 Postgresql - SQL 错误:错误:“[”处或附近的语法错误【英文标题】:Converting TSQL to Postgresql - SQL Error: ERROR: syntax error at or near "[" 【发布时间】:2021-11-10 00:05:26 【问题描述】:

我正在尝试将 TSQL 转换为 PostgreSQL

脚本如下,

select v.ASSET_NUM, v.SERIAL_NUM, xm.NAME, xm.*
from [SiebelDB].[dbo].[S_ASSET] v (nolock) 
inner join [SiebelDB].[dbo].[S_ASSET_XM] xm (nolock) on xm.PAR_ROW_ID = v.ROW_ID
where 
xm.TYPE = 'Service Plan'
and xm.NAME like 'G3%'

我收到一个错误,例如“[”或附近的语法错误 位置:54

有什么帮助吗?

【问题讨论】:

当你想要的结果是 PostgreSQL 时不要标记 SQL Server - 你需要 PostgreSQL 方面的专家。 Bad habits: putting nolock everywhere 这真的是 Postgresql 吗? dbo(nolock) 是 Sql Server 的东西(无论如何你都不应该像这样使用 nolock)。但如果是 Postgresql,该数据库不会使用方括号来标记对象名称。 @JoelCoehoorn OP 想要从 SQL Server 转换,但似乎尚未开始转换。 提示:从清理仍在 SQL Server 中的代码开始。例如。删除(nolock),切换到ANSI SQL 投诉分隔符"S_ASSET",等等。验证它仍然有效。然后转到 Postgresql。 【参考方案1】:

Postgresql 不使用[] 字符来标记对象名称。它也不会以同样的方式处理模式。最后,它没有相同的提示机制(你不应该像在 Sql Server 中那样首先使用nolock,anway)。

对于 Postgresql,我能得到的最接近的结果倾向于如下所示:

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%';

数据库和任何架构上下文由连接属性确定。我说,“倾向于”,因为与 Sql Server 相比,我无法确定您的 postgresql 表是如何设置的。

【讨论】:

Postgres 使用模式的方式与 SQL Server 几乎相同。两者对待数据库的方式不同。

以上是关于将 TSQL 转换为 Postgresql - SQL 错误:错误:“[”处或附近的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将此 Informix 嵌套联接转换为 tsql 嵌套联接?

TSQL:如何将本地时间转换为 UTC? (SQL Server 2008)

如何将 Tsql 标量函数转换为表函数?

请帮助将 Tsql“隐式连接”转换为显式连接

将 varchar 数据类型转换为 datetime 数据类型导致 TSQL 中的值超出范围

无法在 postgresql 中将数字转换为字符串