【问题标题】:Incorrect syntax near '('. Expecting ID'(' 附近的语法不正确。需要 ID
【发布时间】:2023-04-02 20:27:01
【问题描述】:

我查看了其他几个此类问题,但没有找到可以帮助我解决此问题的问题。我想要做的是:我想为所有员工创建一个表,以便分配一个EmployeeID,它将在其他几个表中使用。那张桌子和其他桌子工作正常。当我尝试根据EmployeeType 创建一个新表时,我的问题就出现了,这样我就可以仅根据特定类型的员工提出信息。在所有三个表的 SELECT 语句中,我收到此错误:

'(' 附近的语法不正确。需要 ID。

我已经用谷歌搜索并搜索了如何解决它,但我尝试过的任何方法都不起作用。我错过了什么?

CREATE TABLE Employees
(
    EmployeeID      int             NOT NULL    PRIMARY KEY IDENTITY,
    EmpFirstName    char(50)        NOT NULL,
    EmpLastName     char(50)        NOT NULL,
    EmpAddress      varchar(50)     NOT NULL,
    EmpCity         char(50)        NOT NULL,
    EmpState        char(2)         NOT NULL,
    EmpZipCode      varchar(10)     NOT NULL,
    EmpPhone        varchar(12)     NOT NULL,
    EmpJobTitle     char(30)        NOT NULL,
    EmployeeType    char(30)        NOT NULL,
    Salary          money           NOT NULL,
    HoursPerWeek    int             NOT NULL,
);

CREATE TABLE Collective AS
    (SELECT
        *
    FROM    
        [dbo].[Employees]
    WHERE
        EmployeeID = Employees.EmployeeID
        AND EmployeeType = 'Collective');

CREATE TABLE PaidStaff AS
    (SELECT
        EmployeeID AS ReviewerID,
        EmpFirstName,
        EmpLastName,
        EmpAddress,
        EmpCity,
        EmpState,
        EmpZipCode,
        EmpPhone,
        EmpJobTitle
        Salary,
        HoursPerWeek
    FROM    
        Employees
    WHERE
        EmployeeID = Employees.EmployeeID
        AND EmployeeType = 'PaidStaff');

CREATE TABLE Volunteers AS
    (SELECT
        EmployeeID AS ReviewerID,
        EmpFirstName,
        EmpLastName,
        EmpAddress,
        EmpCity,
        EmpState,
        EmpZipCode,
        EmpPhone,
        EmpJobTitle
    FROM    
        Employees
    WHERE
        EmployeeType = 'Volunteer');

【问题讨论】:

  • 您是否尝试使用create view 而不是create table
  • 没有。它必须是一张桌子。我确实尝试将其更改为视图,但我得到了同样的错误。

标签: sql sql-server tsql


【解决方案1】:

SQL Server 没有CREATE TABLE .... AS (SELECT ... 功能。这不是有效的 T-SQL 语法 - 因此是错误。

如果您想从SELECT 创建一个新表(尚不存在!),您需要改用以下语法:

SELECT
    EmployeeID AS ReviewerID,
    EmpFirstName,
    EmpLastName,
    EmpAddress,
    EmpCity,
    EmpState,
    EmpZipCode,
    EmpPhone,
    EmpJobTitle
INTO 
    dbo.Volunteers    
FROM    
    dbo.Employees
WHERE
    EmployeeType = 'Volunteer';

在新表 - dbo.Volunteers - 尚不存在时有效。

如果您需要向现有表中插入行,则需要使用以下语法:

INSERT INTO dbo.Volunteers (list-of-columns)
    SELECT (list-of-columns)
    FROM dbo.Employees
    WHERE EmployeeType = 'Volunteer';

【讨论】:

  • 太棒了!那工作得很好。感谢您的帮助。只要我可以单击复选标记,我就会。 (尝试并得到一个错误,说我必须再等 9 分钟)
【解决方案2】:

我会说你应该为此使用视图而不是创建额外的表。

CREATE TABLE Employees
(
    EmployeeID      int             NOT NULL    PRIMARY KEY IDENTITY,
    EmpFirstName    char(50)        NOT NULL,
    EmpLastName     char(50)        NOT NULL,
    EmpAddress      varchar(50)     NOT NULL,
    EmpCity         char(50)        NOT NULL,
    EmpState        char(2)         NOT NULL,
    EmpZipCode      varchar(10)     NOT NULL,
    EmpPhone        varchar(12)     NOT NULL,
    EmpJobTitle     char(30)        NOT NULL,
    EmployeeType    char(30)        NOT NULL,
    Salary          money           NOT NULL,
    HoursPerWeek    int             NOT NULL
);
go
CREATE view Collective AS
    (SELECT
        *
    FROM    
        [dbo].[Employees]
    WHERE
        --EmployeeID = Employees.EmployeeID AND /* this does not do anything */
        EmployeeType = 'Collective');
go
CREATE view PaidStaff AS
    (SELECT
        EmployeeID AS ReviewerID,
        EmpFirstName,
        EmpLastName,
        EmpAddress,
        EmpCity,
        EmpState,
        EmpZipCode,
        EmpPhone,
        EmpJobTitle
        Salary,
        HoursPerWeek
    FROM    
        Employees
    WHERE
        --EmployeeID = Employees.EmployeeID AND /* this does not do anything */
        EmployeeType = 'PaidStaff');
go
CREATE view Volunteers AS
    (SELECT
        EmployeeID AS ReviewerID,
        EmpFirstName,
        EmpLastName,
        EmpAddress,
        EmpCity,
        EmpState,
        EmpZipCode,
        EmpPhone,
        EmpJobTitle
    FROM    
        Employees
    WHERE
        EmployeeType = 'Volunteer');

【讨论】:

  • 是的观点在这里最有意义。比总是不同步的相同数据的多个副本要好得多。
猜你喜欢
  • 2021-12-10
  • 2015-12-12
  • 2013-12-16
  • 1970-01-01
  • 2021-10-25
  • 2018-08-14
  • 2011-03-11
  • 2014-02-16
  • 2017-01-11
相关资源
最近更新 更多