以下查询:
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语句中没有错误/警告。
有什么想法吗?
答案 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