得到一个奇怪的错误,SQL Server查询使用`WITH`子句

时间:2010-04-30 18:53:42

标签: sql-server

以下查询:

WITH 
    CteProductLookup(ProductId, oid) 
    AS 
    (
        SELECT p.ProductID, p.oid
        FROM [dbo].[ME_CatalogProducts] p 
    )

SELECT 
    rel.Name as RelationshipName,
    pl.ProductId as FromProductId,
    pl2.ProductId as ToProductId
FROM 
    (
    [dbo].[ME_CatalogRelationships] rel 
    INNER JOIN CteProductLookup pl 
    ON pl.oid = rel.from_oid
    ) 
    INNER JOIN CteProductLookup pl2 
    ON pl2.oid = rel.to_oid
WHERE
    rel.Name = 'BundleItem' AND
    pl.ProductId = 'MX12345';

产生此错误:

  

Msg 319,Level 15,State 1,Line 5   关键字附近的语法不正确   “用”。如果这种说法很常见   表表达式,xmlnamespaces   子句或更改跟踪上下文   条款,以前的陈述必须是   以分号结束。

仅限执行。管理工作室的sql语句中没有错误/警告。

有什么想法吗?

4 个答案:

答案 0 :(得分:82)

总是使用像;WITH这样的语句,然后你永远不会得到这个错误。 WITH命令在它和任何前一个命令之间需要;,总是使用;WITH,你永远不必记住这样做。

请参阅创建和使用公用表表达式指南

部分中的WITH common_table_expression (Transact-SQL)
  

在语句中使用CTE时   声明是批次的一部分   在必须遵循之前   分号。

答案 1 :(得分:17)

;WITH 
    CteProductLookup(ProductId, oid) 
    AS 
...

答案 2 :(得分:4)

在WITH关键字之前直接放置分号应该是合法的。

答案 3 :(得分:1)

在某些情况下,如果您有表提示,并且WITH子句和提示之间也有空格,则也会发生这种情况,因此最好像这样输入:

SELECT Column1 FROM Table1 t1 WITH(NOLOCK)
INNER JOIN Table2 t2 WITH(NOLOCK) ON t1.Column1 = t2.Column1

不是:

SELECT Column1 FROM Table1 t1 WITH (NOLOCK)
INNER JOIN Table2 t2 WITH (NOLOCK) ON t1.Column1 = t2.Column1