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]
而不是cteCteProductLookup
,因为cteCteProductLookup实际上什么都做不了?对于以后的扩展,您是对的,在本例中我不需要它。似乎您可以通过使用多个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