2010-04-30 7 views
27

La siguiente consulta:Conseguir un error extraño, consulta de SQL Server usando `cláusula WITH`

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'; 

está generando este error:

Msg 319, Level 15, State 1, Line 5 Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

En ejecución solamente. No hay errores/advertencias en la declaración sql en el estudio de gestión.

¿Alguna idea?

+1

por qué incluso el uso de un CTE aquí? ¿no podría simplemente unirse a la tabla actual '[dbo]. [ME_CatalogProducts]' en lugar de la cte 'CteProductLookup', que realmente no hace nada? –

+1

Para la extensión posterior, pero tiene razón, no la necesito en este ejemplo. – Aren

Respuesta

62

siempre use con una declaración como ;WITH, entonces nunca obtendrá este error. El comando WITH requiere un ; entre cualquier comando anterior, siempre usando ;WITH, nunca tendrá que acordarse de hacer esto.

ver WITH common_table_expression (Transact-SQL), de la sección Directrices para la creación y uso de expresiones de tabla comunes:

When a CTE is used in a statement that is part of a batch, the statement before it must be followed by a semicolon.

+0

SQL Server se está moviendo hacia la exigencia de que las declaraciones terminen con punto y coma. SQL2012 los requiere en muchos más lugares que solo CTE y declaraciones de fusión. Esta solución parece ser un truco para un error en su implementación. –

+0

A menos que vayan a "arreglar" todo su código TSQL, sí, es un "truco". De lo contrario, esto lo hará funcionar, especialmente si solo está manteniendo algún código heredado. Es algo bueno que debe tener en cuenta, para que pueda planificar su actualización. Hay algunas herramientas automatizadas que agregarán puntos y comas para usted. –

3

Debería ser legal poner un punto y coma directamente antes de la palabra clave WITH.

14
;WITH 
    CteProductLookup(ProductId, oid) 
    AS 
... 
Cuestiones relacionadas