什么是PostgreSQL相当于TSQL"go"语句?

Jos*_*rek 7 t-sql postgresql

在T-SQL中,我可以说:

IF EXISTS (SELECT name 
           FROM   sysobjects 
           WHERE  name = 'tableName') 
  DROP TABLE [dbo].[tableName] 
go 
Run Code Online (Sandbox Code Playgroud)

以下SQL命令的等效批处理终结符(即"go")是什么?

DROP TABLE IF EXISTS tableName
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 9

PostgreSQL等价物将是:

DROP TABLE IF EXISTS tableName;
Run Code Online (Sandbox Code Playgroud)

所以终结符只是SQL标准的分号;.

  • 我不同意分号相当于"GO".`GO`是批处理语句终止符.可以在批处理中执行多个语句,并且"GO"终止该批处理.`GO`很重要,因为它可用于创建包含正常语句和语句的单个脚本,这些语句必须是批处理中的唯一语句. (4认同)

use*_*r_0 6

从SQL Server文档:

GO不是Transact-SQL语句; 它是sqlcmd和osql实用程序以及SQL Server Management Studio代码编辑器可识别的命令.

语法允许在关键字go之后具有一个数字,以多次重复前一行.语法是:

GO [count]
Run Code Online (Sandbox Code Playgroud)

它分离批次.没有PostgreSQL的等价物.分号结束语句,而不是批处理.并且无法指定多个执行.

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


Pav*_*ule 5

这取决于。GO是分隔符(定界符)-这是一个特殊关键字,在任何SQL语句中均不使用。PostgreSQL使用分号;作为分隔符。在控制台psql中,您可以使用\g

postgres=# select 10 as a
postgres-# \g
+----+
| a  |
+----+
| 10 |
+----+
(1 row)
Run Code Online (Sandbox Code Playgroud)

但它并不经常使用。有时人们使用\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 $$;
Run Code Online (Sandbox Code Playgroud)

或更简单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
Run Code Online (Sandbox Code Playgroud)