2010-04-30 23 views
27

Các truy vấn sau đây:Bắt lỗi lẻ, truy vấn SQL Server sử dụng `WITH` khoản

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

Là tạo ra lỗi này:

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.

On thực hiện chỉ. Không có lỗi/cảnh báo trong câu lệnh sql trong studio quản lý.

Bất kỳ ý tưởng nào?

+1

tại sao thậm chí sử dụng một CTE đây? bạn không thể chỉ cần tham gia vào bảng thực tế '[dbo]. [ME_CatalogProducts]' thay vì cte 'CteProductLookup', mà không thực sự làm gì cả? –

+1

Để gia hạn sau, nhưng bạn nói đúng Tôi không cần nó trong ví dụ này. – Aren

Trả lời

62

luôn sử dụng với tuyên bố như ;WITH thì bạn sẽ không bao giờ gặp lỗi này. Lệnh WITH yêu cầu ; giữa bất kỳ lệnh nào trước đó, bằng cách luôn sử dụng ;WITH bạn sẽ không bao giờ phải nhớ làm điều này.

thấy WITH common_table_expression (Transact-SQL), từ phần Hướng dẫn Tạo và sử dụng Common Table Expressions:

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 đang di chuyển theo hướng yêu cầu báo cáo được chấm dứt bằng dấu chấm phẩy. SQL2012 yêu cầu chúng ở nhiều nơi hơn là chỉ các câu lệnh CTE và Merge. Sửa chữa này có vẻ là một hack cho một lỗi trong việc thực hiện của họ. –

+0

Trừ khi họ sẽ "sửa" tất cả mã TSQL của họ, có, đó là "hack". Nếu không, điều này sẽ làm cho nó hoạt động, đặc biệt nếu bạn chỉ đang duy trì một số mã cũ. Nó là một điều tốt để nhận thức được, vì vậy bạn có thể lập kế hoạch cho nâng cấp của bạn. Có một số công cụ tự động sẽ thêm dấu chấm phẩy cho bạn. –

3

Sẽ là hợp pháp khi đặt dấu chấm phẩy ngay trước từ khóa WITH.

14
;WITH 
    CteProductLookup(ProductId, oid) 
    AS 
... 
Các vấn đề liên quan