2010-04-30 12 views
27

La seguente query:Ottenere un errore strano, query SQL Server utilizzando `clausola 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'; 

sta generando questo errore:

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.

Su esecuzione solo. Non ci sono errori/avvertenze nell'istruzione sql nello studio di gestione.

Qualche idea?

+1

perché anche utilizzare un CTE qui? non potresti semplicemente unirti alla tabella reale '[dbo]. [ME_CatalogProducts]' invece di cte 'CteProductLookup', che in realtà non fa nulla? –

+1

Per l'estensione più tardi, ma hai ragione non ne ho bisogno in questo esempio. – Aren

risposta

62

utilizzare sempre con istruzione come ;WITH quindi non si otterrà mai questo errore. Il comando WITH richiedeva uno ; tra qualsiasi comando precedente, usando sempre ;WITH che non dovrai mai ricordare di fare.

vedere WITH common_table_expression (Transact-SQL), dalla sezione Linee guida per la creazione e utilizzo di espressioni di tabella comuni:

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 si sta muovendo verso richiedere che le istruzioni vengano terminate dal punto e virgola. SQL2012 li richiede in molti più posti rispetto alle sole dichiarazioni CTE e Merge. Questa correzione sembra essere un hack per un bug nella loro implementazione. –

+0

A meno che non stiano "sistemando" tutti i loro codici TSQL, sì è un "hack". Altrimenti, questo lo renderà funzionante, specialmente se stai semplicemente mantenendo un po 'di codice legacy. È una buona cosa essere a conoscenza, quindi puoi pianificare il tuo aggiornamento. Esistono alcuni strumenti automatici che aggiungeranno il punto e virgola per te. –

3

Dovrebbe essere legale inserire un punto e virgola direttamente prima della parola chiave WITH.

14
;WITH 
    CteProductLookup(ProductId, oid) 
    AS 
... 
Problemi correlati