在 SQL Server 中使用 select 来使用标准创建表时,收到“In Correct syntax around '('”错误消息

Mar*_*len 8 sql-server t-sql errors

当我通过 Microsoft SQL Server Management Studio 使用 SQL Server 运行以下查询时,为什么会在本文的标题中出现错误?

-- create the dash_airports table
CREATE TABLE dash_airports 
    AS ( SELECT [Loc_Id], [ARP_Latitude], [ARP_Longitude], [Facility_Type], [Wind_Indicator] 
    FROM airportandrunway.dbo.Airports
    WHERE  [Loc_Id] IN ('09J','14A','18A','1V6','22S','2I0','YKM','YKN') );

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '('.
Run Code Online (Sandbox Code Playgroud)

我按照本指南文章中解决方案 2 的说明进行操作,但它显然不起作用。因此,作为健全性检查,我在 MySQL Workbench 中运行了它,它确实在那里工作了!是什么赋予了?

证明它在 Workbench 中有效: 在此输入图像描述

小智 14

恭喜!您发现了 SQL 方言。

SQL数据库系统有很多,每个系统都有自己的SQL方言。有时差异很小,有时差异很大。通常,差异出现在 SQL 的 DDL(数据定义语言)部分,该部分具有操作数据库对象的命令,例如CREATE TABLEALTER INDEX

你提到的这篇文章是一篇糟糕的文章,因为它没有说明它教的是哪种方言。它实际上是MySQL,但文章中没有提及。

MySQL 方言以使用它的 MySQL DBMS 命名 - 当然,连接到 MySQL DBMS 的“Workbench”工具运行得很好。

-- That is MySQL
CREATE TABLE gamer
AS 
SELECT
  gamer, score, championship_date
FROM championship
WHERE championship_date <= 2020-08-10;
Run Code Online (Sandbox Code Playgroud)

Microsoft SQL Server 使用 T-SQL。类似于 T-SQL 中的 MySQL 语句:

-- That is T-SQL
SELECT
  gamer, score, championship_date
INTO gamer
FROM championship
WHERE championship_date <= 2020-08-10;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,MySQL 方言与 Oracle 使用的 PL/SQL 非常接近。虽然存在差异,但从 select 创建表的操作类似。

对于此任务,大多数其他方言都模仿其他最古老的方言 - Transact SQL,由 Sybase 开发。T-SQL 是 Transact SQL 的非常接近的继承者,但也存在差异。

  • “*因为它没有说明它教授哪种方言。*” - SQL 标准中指定了“CREATE TABLE AS”,因此它并不是真正的“方言事物”。而MySQL的过程语言是从接近Oracle的PL/SQL开始的 (2认同)

Tib*_*szi 7

正如 Denis 提到的,MSSQL( Synapse Analytics除外)没有CREATE TABLE AS SELECT. MSSQL 中的对应功能就是我们所说的基于SELECT INTO语句结果创建和填充表的能力SELECT

例子:

SELECT Loc_Id, ARP_Latitude, ARP_Longitude, Facility_Type, Wind_Indicator 
INTO dash_airports
FROM airportandrunway.dbo.Airports
WHERE  Loc_Id IN ('09J','14A','18A','1V6','22S','2I0','YKM','YKN')
Run Code Online (Sandbox Code Playgroud)