Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取一个奇怪的错误,SQL Server使用`WITH`子句进行查询_Sql Server - Fatal编程技术网

Sql server 获取一个奇怪的错误,SQL Server使用`WITH`子句进行查询

Sql server 获取一个奇怪的错误,SQL Server使用`WITH`子句进行查询,sql-server,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 ToPr

以下查询:

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,第15级,状态1,第5行 关键字附近的语法不正确 “有”。如果此语句是常见的 表表达式,一个xmlnamespaces 子句或更改跟踪上下文 子句中,前面的语句必须为 以分号结尾

仅在执行时打开。Management studio中的sql语句中没有错误/警告


有什么想法吗?

在WITH关键字前面直接放一个分号应该是合法的。

始终与语句一起使用,如
;如果使用
,则永远不会出现此错误。WITH命令需要一个
,在它和任何以前的命令之间执行code>;有了
,您将永远不必记得这样做

请参见“创建和使用通用表表达式的指导原则”一节中的:

当在以下语句中使用CTE时: 是批处理的一部分,语句 在它后面必须有一个 分号


在某些情况下,如果您有表提示,并且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

为什么还要在这里使用CTE?您不能直接连接到实际的表
[dbo].[ME_CatalogProducts]
而不是cte
CteProductLookup
,因为cte
CteProductLookup实际上什么都做不了?对于以后的扩展,您是对的,在本例中我不需要它。似乎您可以通过使用多个
with
语句来获得此消息。第一个只需要一个,然后使用逗号,只需给下一个名称加上无限长括号中的列即可。您不需要在最后一个逗号后加逗号,然后您可以选择它的SQL Server正在向要求语句以分号结尾的方向发展。SQL2012在很多地方需要它们,而不仅仅是CTE和Merge语句。这个补丁似乎是对他们实现中的一个bug的攻击。除非他们打算“修复”所有的TSQL代码,是的,这是一个“攻击”。否则,这将使它工作,特别是如果您只是维护一些遗留代码。这是一件值得注意的事情,因此您可以计划升级。有一些自动工具可以为您添加分号。
SELECT Column1 FROM Table1 t1 WITH (NOLOCK)
INNER JOIN Table2 t2 WITH (NOLOCK) ON t1.Column1 = t2.Column1