CREATE VIEW 必须是批处理 MS SQL Server 中的唯一语句

Posted

技术标签:

【中文标题】CREATE VIEW 必须是批处理 MS SQL Server 中的唯一语句【英文标题】:CREATE VIEW must be the only statement in the batch MS SQL Server 【发布时间】:2020-12-03 17:36:58 【问题描述】:

Microsoft SQL Server Management Studio 18 显示错误:

CREATE VIEW 必须是批处理中的唯一语句

执行请求后,出现如下错误:

“select”关键字周围的语法不正确

create view revenue0 (supplier_no, total_revenue) as
    select
        l_suppkey,
        sum(l_extendedprice * (1 - l_discount))
    from
        lineitem
    where
        l_shipdate >= '1996-05-01'
        and l_shipdate < dateadd(mm,3,cast('1996-05-01' as datetime))
    group by
        l_suppkey;


select
s_suppkey,
s_name,
s_address,
s_phone,
total_revenue
from
supplier,
revenue0
where
    s_suppkey = supplier_no
    and total_revenue = (
        select
            max(total_revenue)
        from
            revenue0
    )
order by
s_suppkey
option (maxdop 2)
drop view revenue0

UPD。我尝试使用这种方法运行:

create view revenue0 (supplier_no, total_revenue) as
    select
        l_suppkey,
        sum(l_extendedprice * (1 - l_discount))
    from
        lineitem
    where
        l_shipdate >= cast('1996-05-01' as datetime)
        and l_shipdate < dateadd(mm, 3, cast('1996-05-01' as datetime))
    group by
        l_suppkey;

go
select
    s_suppkey,
    s_name,
    s_address,
    s_phone,
    total_revenue
from
    supplier,
    revenue0
where
    s_suppkey = supplier_no
    and total_revenue = (
        select
            max(total_revenue)
        from
            revenue0
    )
order by
    s_suppkey;

drop view revenue0;

但是作为执行请求的结果,显示错误: 无效的对象名称“revenue0”。 只要我没有改名。 SQL 都以这个名字发誓。

UPD2。这个问题是独立解决的。话题已关闭!谢谢大家的努力!

【问题讨论】:

在视图定义后面加上GO这个词。 你能告诉我具体在哪里吗?我不太擅长 SQL。非常感谢! group by l_suppkey; GO 围绕“go”构造的语法不正确。 你不能在视图中使用“order by”,重新设计你的视图以不使用它。 【参考方案1】:

错误告诉您 CREATE VIEW 必须是批处理中的唯一语句。正如 Gordon 所说,批处理在 SQL Server 中以“GO”关键字结束,因此您的代码应如下所示:

create view revenue0 (supplier_no, total_revenue) as
    select
        l_suppkey,
        sum(l_extendedprice * (1 - l_discount))
    from
        lineitem
    where
        l_shipdate >= '1996-05-01'
        and l_shipdate < dateadd(mm,3,cast('1996-05-01' as datetime))
    group by
        l_suppkey;

GO -- right here. This ends a batch. Must be on a new line, with no semi-color, or SQL gets pissy. 

select
    s_suppkey,
    s_name,
    s_address,
    s_phone,
    total_revenue
from
    supplier,
    revenue0
where
    s_suppkey = supplier_no
    and total_revenue = (
        select
            max(total_revenue)
        from
            revenue0
    )
order by
    s_suppkey
option (maxdop 2); 

drop view revenue0;

【讨论】:

我正在测试“MS-SQL-Server 上的 TPC-H 测试”这些东西:link。执行此请求时,应为:link. 但是,经过您的更正,执行 SQL 查询后,输出是一个空表。请求执行时间为 0 秒。这不正常。 您可以帮助重新制作此查询以使其正常工作:link。 我已经和他断了头。但是这个特定的查询不想工作。其余的都在工作。

以上是关于CREATE VIEW 必须是批处理 MS SQL Server 中的唯一语句的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 视图的创建- (create view必须是批处理中仅有的语句)

sql server 2008数据库提示错误create view必须是批处理中仅有的语句

sql 建立视图中 一直遇到Create view必须是批处理中仅有的语句报错

我建立的sql列表出现'CREATE VIEW' 必须是查询批次中的第一个语句。

'CREATE VIEW'必须是查询批处理中的第一个语句

SQL基础语法—create view语句