PostgreSQL中与TSQL的"go"语句相当的是什么?

16

在 T-SQL 中,我可以这样陈述:

IF EXISTS (SELECT name 
           FROM   sysobjects 
           WHERE  name = 'tableName') 
  DROP TABLE [dbo].[tableName] 
go 

以下SQL命令的批处理终止符等价于哪个(即"go")?

DROP TABLE IF EXISTS tableName

我不明白 - 你是在寻找一个匿名代码块吗:http://www.postgresql.org/docs/9.4/static/plpython-do.html?你的 DROP TABLE 命令看起来本身就很好。 - Politank-Z
2
GO不是一条语句,而是仅用于SQL Server Management Studio的分隔符。它并不是SQL / T-SQL语言的一部分。 - marc_s
我认为你想要使用Postgres的元命令分隔符:尝试使用双反斜杠“\”代替“go”。 - Bohemian
Postgres使用SQL语言中定义的分隔符:;,您也应该开始在SQL Server中使用它:https://sqlblog.org/2009/09/03/ladies-and-gentlemen-start-your-semi-colons - user330315
@a_horse_with_no_name; 我可以说 GO 在 SQL Server 中结束了一个语句的范围,并且使用它会删除局部变量,那么 ; 是否也像这样结束了一个范围呢? - shA.t
1
使用PostgreSQL批处理终止符“;”替换T-SQL批处理终止符“GO”。 - Vivek S.
3个回答

15

根据 SQL Server 文档:

GO 不是一个 Transact-SQL 语句,而是一个由 sqlcmd 和 osql 实用程序以及 SQL Server Management Studio 代码编辑器识别的命令。

该语法允许在 go 关键字后面有一个数字,以便重复前面的行多次。语法如下:

GO [count]

它分离了批处理。PostgreSQL没有相应的功能。分号是结束语句而不是批处理,并且不可能指定执行次数。

参考资料: https://msdn.microsoft.com/it-it/library/ms188037.aspx


8

PostgreSQL的等效语句为:

DROP TABLE IF EXISTS tableName;

因此,终止符只是SQL标准中的分号;

11
我不认同分号等效于“GO”的说法。GO是批处理语句终止符,一个批处理内可以执行多个语句,而GO则终止该批处理。GO很重要,因为它可以用来创建包含正常语句和必须作为批处理中唯一语句的语句的单个脚本。 - NathanAldenSr
这不是等同的。例如,MS SQL中的GO命令会创建(并结束)一个本地作用域,在其中可以声明变量。GO命令将清除这些声明。 - Magne Rekdal

5
这要看情况。 GO 是分隔符(定界符) - 它是一个特殊的关键字,不用于任何 SQL 语句。PostgreSQL 使用分号 ; 作为分隔符。在控制台 psql 中,您可以使用 \g
postgres=# select 10 as a
postgres-# \g
+----+
| a  |
+----+
| 10 |
+----+
(1 row)

但这种方法并不经常使用。有时候人们会使用\gset来执行SQL语句并将结果存储到psql本地变量中。PostgreSQL可以使用分号,因为PostgreSQL SQL语句不需要包含此符号 - 这与T-SQL不同,因为T-SQL允许一些过程构造直接在SQL中使用 - 然后T-SQL需要特殊的分隔符。PostgreSQL不允许这样做 - 过程代码必须输入为字符串 - 并通过单引号或自定义字符串分隔符进行分隔。因此,过程性条件删除可能如下所示:

DO $$BEGIN
  IF EXISTS (SELECT * FROM information_schema.tables 
               WHERE table_name = 'someTable') -- attention CASE SENSITIVITY
  THEN
    DROP TABLE "someTable"; -- attention CASE SENSITIVE syntax
  END IF; 
END $$;

更简单地说,可以使用不区分大小写的语法DROP TABLE IF EXISTS someTable。我使用了自定义的字符串分隔符$$
DO $$ -- DO command with start of string (started by custom separator)
...   -- some procedural code
$$ ;  -- end string by custom separator and semicolon as end of DO command

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接